Поиск по значениям словаря - PullRequest
       1

Поиск по значениям словаря

4 голосов
/ 13 сентября 2011

У меня есть словарь, который содержит Product значения со свойствами, такими как description. В обработчике textbox1_textchanged я хочу искать Продукты в словаре, в котором есть определенный текст в description.

Я пробовал это:

var values = (from pv in mydictionary
              where pv.Value.description.Contains(textBox1.Text)
              select pv.Value);

Этот код не работает, потому что вторая клавиша, которую я нажал, значения var values ​​пуста.

Все примеры, которые я нашел, ищут по ключам, но мне нужно искать по значениям словаря.

Ответы [ 4 ]

6 голосов
/ 13 сентября 2011

Однако у вас нет действительного кода.Вы пытаетесь отфильтровать значения, которые имеют определенное описание, но вам не хватает ключевого элемента.Вам нужно добавить предложение where, чтобы завершить его.

var values =
    from pv in mydictionary
    where pv.Value.description.Contains(textBox1.Text)
    select pv.Value;

Однако, лучший способ написать это - просто взглянуть на значения словаря.

var values =
    from value in mydictionary.Values // Note: we're looking through the values only,
                                      // not all the key/value pairs in the dictionary
    where value.description.Contains(textBox1.Text)
    select value;

Чтобы сделать это без учета регистра, вы можете попробовать использовать String.IndexOf(), поскольку это одно из немногих сравнений, которое может выполнять поиск, игнорируя регистр.

var values =
    from value in mydictionary.Values
    where value.description
               .IndexOf(textBox1.Text, StringComparison.OrdinalIgnoreCase) != -1
               // any value that isn't `-1` means it contains the text
               // (or the description was empty)
    select value;
2 голосов
/ 13 сентября 2011

Попробуйте

var values =  mydictionary.Where(k => k.Value.description.Contains(textBox1.Text))
                          .Select(k => k.Value);
0 голосов
/ 13 сентября 2011

Еще одна вещь, которую вы можете рассмотреть, заключается в том, что метод string.Contains выполняет поиск с учетом регистра.

var str = "The quick brown fox blah";
var test1 = "quick";
var test2 = "Quick";

Console.WriteLine(string.Format("{0} CONTAINS {1} = {2}", str, test1, str.Contains(test1)));

Console.WriteLine(string.Format("{0} CONTAINS {1} = {2}", str, test2, str.Contains(test2)));

//Output
The quick brown fox blah CONTAINS quick = True
The quick brown fox blah CONTAINS Quick = False

Если вы не можете выполнить поиск без учета регистра, чтобы оба приведенных выше результата возвращали true, сначала следует поместить строки в нижнем регистре ...

Console.WriteLine(string.Format("{0} CONTAINS {1} = {2}", str, test1, str.ToLower().Contains(test1.ToLower())));

Console.WriteLine(string.Format("{0} CONTAINS {1} = {2}", str, test2, 
str.ToLower().Contains(test2.ToLower())));

//Output
The quick brown fox blah CONTAINS quick = True
The quick brown fox blah CONTAINS Quick = True
0 голосов
/ 13 сентября 2011

Измените предложение where на:

where value != null && value.description != null && value.description.Contains(textBox1.Text) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...