Я ищу способ поиска значений в хеш-таблице .net с использованием подстановочных знаков - PullRequest
1 голос
/ 02 декабря 2008

У меня есть целый набор значений, хранящихся в хеш-таблице .net 2.0. То, что я действительно хотел бы найти, это способ, по сути, сделать SQL-оператор выбора для таблицы.

Это означает, что я хотел бы получить список ключей, связанные значения которых соответствуют очень простому текстовому шаблону (вдоль строк "начинается с числа".)

Конечной целью будет удаление этих записей из хеш-таблицы для дальнейшей обработки.

Я уже некоторое время бьюсь головой об этом, и, похоже, я ничего не могу придумать.

Есть идеи?

(По случайности это имеет значение: из-за реалий этого проекта любые сторонние виджеты или обновление до более поздней версии .net исключены.)

Ответы [ 3 ]

3 голосов
/ 02 декабря 2008

Если вы действительно ищете вещи, которые начинаются с числа, то вы можете сделать это намного быстрее, чем с помощью регулярных выражений. Просто посмотрите на первый символ каждой клавиши и определите, является ли она цифрой. Храните ключи, которые вы хотите удалить, в списке, так как вам нужно только сохранить ключ.

    List<string> keysToRemove = new List<string>( myhashtable.Count );
    foreach (string key in myhashtable.Keys)
    {
        if (char.IsDigit(key[0])
        {
            keysToRemove.Add(key);
        }
    }

    foreach (string key in keysToRemove)
    {
        myhashtable.Remove(key);
    }
2 голосов
/ 02 декабря 2008

Вы можете использовать регулярные выражения для каждого ключа в хеш-таблице. Это очень грязно, но работает:

    static void Main(string[] args)
    {
        Hashtable myhashtable = new Hashtable();
        myhashtable.Add("Teststring", "Hello");
        myhashtable.Add("1TestString1", "World");
        myhashtable.Add("2TestString2", "Test");

        List<String> newht = new List<String>;

        //match all strings with a number at the front
        Regex rx = new Regex("^[1-9]");
        foreach (string key in myhashtable.Keys)
        {
            if (rx.IsMatch(key) == true)
            {
                newht.Add(key);
            }
        }

        //Loop through all the keys in the new collection and remove them from
        //them from the main hashtable.
        foreach (string key in newht)
        {
            myhashtable.Remove(key);
        }
    }

РЕДАКТИРОВАТЬ: И просто для удовольствия, вот версия LINQ (извините, я тоже только что).

            Hashtable myhashtable = new Hashtable();
            myhashtable.Add("Teststring", "Hello");
            myhashtable.Add("1TestString1", "World");
            myhashtable.Add("2TestString2", "Test");

            Regex rx = new Regex("^[1-9]");
            var k = (from string key in myhashtable.Keys
                     where rx.IsMatch(key)
                     select key).ToList();

            k.ForEach(s => myhashtable.Remove(s));

РЕДАКТИРОВАТЬ: я только что добавил список sting, а не хеш-таблицу, я не мог вспомнить, какая версия .net имеет общие списки в нем *** шлепает лоб

1 голос
/ 02 декабря 2008

Использование LINQ:

Dim myhashtable As New Hashtable
    myhashtable.Add("Teststring", "Hello")
    myhashtable.Add("1TestString1", "World")
    myhashtable.Add("2TestString2", "Test")

For Each i As String In From Element In myhashtable.Cast(Of DictionaryEntry)() Let k = DirectCast(Element.Value, String) Where k.StartsWith("W") Select DirectCast(Element.Key, String)
        MsgBox("This key has a matching value:" & i)
    Next

Но лучше использовать словарь при использовании LINQ:

    Dim d = New Dictionary(Of String, String)()
    d.Add("Teststring", "Hello")
    d.Add("1TestString1", "World")
    d.Add("2TestString2", "Test")

    For Each i As String In From element In d Where element.Value.StartsWith("W") Select element.Key
        MsgBox("This key has a matching value:" & i)
    Next

И вместо .StartsWith ("W") вы, конечно, можете выполнять любую другую фильтрацию, какую захотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...