最初我有以下代码。
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
的所有项目
答案 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)