словарь: поиск ключевых строк с подобной функцией - PullRequest
13 голосов
/ 24 января 2011

Я хочу найти мои ключи в Словаре с подобной функцией. Я хочу, чтобы ключи начинались с «а» или их 3-я буква была «е» или их 4-я буква не была «d»

в sql можно писать запросы "где (ключ как ' a ') и (ключ не как 'd __ ')" Я хочу иметь эту функцию для словаря , Любое предложение алгоритма у вас есть?

Спасибо!

Ответы [ 5 ]

13 голосов
/ 24 января 2011

Хотя это будет SQL-эквивалент сканирования таблицы, вы можете использовать LINQ или методы расширения IEnumerable<T> для поиска в вашем словаре всех значений, ключи которых соответствуют шаблону:

Метод расширения:

var values = dictionary.Where(pv => 
             pv.Key.StartsWith("A") || 
             (pv.Key.Length >= 3 && pv.Key[2] == 'e') || 
             pv.Key.Length < 4 || 
             pv.Key[3] != 'd').Select(pv => pv.Value);

LINQ:

var values = (from pv in dictionary
              where pv.Key.StartsWith("A") ||
                    (pv.Key.Legnth >= 3 && pv.Key[2] == 'e') ||
                    pv.Length < 4 ||
                    pv.Key[3] != 'd'
                    select pv.Value);

Обратите внимание, что последняя часть обоих этих предикатов относится к вашей "четвертой букве не" d ". Я понял, что это означает, что строкаэто будет соответствовать длине в три символа (или меньше). Если вы имеете в виду, что строка содержит не менее четырех символов И ее четвертый символ не равен "d", то изменения должны быть очевидны.

Помните, что основной (преимущество) для класса Dictionary заключается в использовании поиска ключей на основе хеша, который (в среднем и лучшем случае) равен O (1). При использовании линейного поиска, подобного этому, O (n), поэтому что-то вроде этого будет,как правило, медленнее, чем обычный поиск ключей.

12 голосов
/ 24 января 2011

Вы можете получить доступ к свойству Keys словаря и затем использовать запрос Linq для оценки ваших ключей:

var dictionary = new Dictionary<string,string>();

dictionary.Keys.Where( key => key.Contains("a")).ToList();
3 голосов
/ 24 января 2011

Вы можете использовать LINQ

Примерно так:

myDic.Where(d=>d.Key.StartWith("a")).ToDictionary(d=>d.Key,d=>d.Value)

Или

myDic.Where(d=>d.Key.Contains("b")).ToDictionary(d=>d.Key,d=>d.Value)

Или

myDic.Where(d=>some other condition with d.Key).ToDictionary(d=>d.Key,d=>d.Value)
3 голосов
/ 24 января 2011

Просто используйте Linq:

var query = myDict.Where(x => x.Key.IndexOf('a') > -1 && x.Key.IndexOf("d_") == -1);
1 голос
/ 24 января 2011

Вот небольшое расширение, которое я выбрал:

public static IList<string> KeysLikeAt(this Dictionary<string, object> dictionary, char letter, int index)
{
    return dictionary.Where(k => k.Key.Length > index && k.Key[index] == letter)
        .Select(k => k.Key).ToList();
}

public static IList<string> KeysNotLikeAt(this Dictionary<string, object> dictionary, char letter, int index)
{
    return dictionary.Where(k => k.Key.Length > index && k.Key[index] != letter)
        .Select(k => k.Key).ToList();
}

, и вы можете использовать его так:

IList<string> keysStartingWithA = dictionary.KeysLikeAt('a', 0);

IList<string> keysNotStartingWithD = dictionary.KeysNotLikeAt('d', 0);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...