搜索字典的值

时间:2011-09-13 19:04:16

标签: c# linq dictionary

我的字典包含Product个值,其中包含description等属性。 在textbox1_textchanged处理程序中,我想在字典中搜索description中包含特定文本的产品。

我试过这个:

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

此代码无效,因为我按下的第二个键值var值为空。

我找到的所有示例都是通过键搜索,但我需要搜索字典的值。

4 个答案:

答案 0 :(得分:6)

但您拥有的不是有效代码。您正在尝试过滤具有特定描述但缺少关键元素的值。您需要添加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;

答案 1 :(得分:2)

尝试

var values =  mydictionary.Where(k => k.Value.description.Contains(textBox1.Text))
                          .Select(k => k.Value);

答案 2 :(得分:0)

将where子句更改为:

where value != null && value.description != null && value.description.Contains(textBox1.Text) 

答案 3 :(得分:-1)

您可能需要考虑的另一件事是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