Словарь: поиск ключевых строк с похожими функциями

Я хочу искать ключи в словаре с подобной функцией. Я хочу, чтобы ключи начинались с "a", или их третья буква "e", или их 4rt буква не "d"

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

Спасибо!

Ответ 1

Пока это будет эквивалент 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), так что что-то вроде этого будет, в общем, медленнее обычного поиска ключей.

Ответ 2

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

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

dictionary.Keys.Where( key => key.Contains("a")).ToList();

Ответ 3

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

var query = myDict.Where(x => x.Key.IndexOf('a') > -1 && x.Key.IndexOf("d_") == -1);

Ответ 4

Вы можете использовать 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)

Ответ 5

Здесь немного растянулось:

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);