Словарь: поиск ключевых строк с похожими функциями
Я хочу искать ключи в словаре с подобной функцией. Я хочу, чтобы ключи начинались с "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);