搜索列表中的项目列表

时间:2011-02-01 10:07:54

标签: .net c#-4.0

最初我有以下代码。

var list = new Dictionary<string, int>();
list.Add("abcd", 1);
list.Add("abc", 12);
list.Add("def", 14);

//查找此列表中的项目非常简单。

var results = list.Where(p => p.Value.Equals("abc"));

这是我的问题。

如果我有搜索词列表,如何在列表中搜索这些项目。我不想为此使用for循环。是否有内置功能或我需要编写扩展方法?

List<string> searchList = new List<string>();
searchList.Add("abc") ;
searchList.Add("def") ;

查找searchList

list的所有项目

2 个答案:

答案 0 :(得分:3)

您可以使用IEqualityComparer界面:

public class EqualityComparer : IEqualityComparer<string>
{

    public bool Equals(string x, string y)
    {
        return y.Contains(x);
    }

    public int GetHashCode(string obj)
    {
        return obj.GetHashCode();
    }
}

然后使用它:

        HashSet<string> searchList = new HashSet<string>();
        searchList.Add("abc");
        searchList.Add("def");

        var list = new Dictionary<string, int>();
        list.Add("abcd", 1);
        list.Add("abc", 12);
        list.Add("def abc", 14);
        list.Add("test test", 15);

        var lst = list.Where(p => searchList.Contains(p.Key, new EqualityComparer()));

正如@Ani所说,这种平等并不好,你也可以这样做:

var lst1 = list.Where(p => searchList.Any(x => p.Key.Contains(x)));

自己添加空检查。

答案 1 :(得分:1)

我建议您为searchList使用HashSet,然后执行以下操作:

HashSet<string> searchList = new HashSet<string>();
searchList.Add("abc");
searchList.Add("def");

var list = new Dictionary<string, int>();
list.Add("abcd", 1);
list.Add("abc", 12);
list.Add("def", 14);

list.Where(p => searchList.Contains(p.Key));

这将阻止在每次执行Where子句时对searchList执行O(n)操作,因为查找应该接近O(1)