2011-02-01 124 views
1

最初我有以下代码。搜索列表中的项目列表

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

应该在你的搜索列表中匹配“abc”和“abcd”吗? – 2011-02-01 10:56:38

+0

@Matt Ellenyes yes – Adeel 2011-02-01 10:58:19

回答

3

您可以使用IEqualityComparer interfa CE:

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))); 

只需自己添加空checkings。

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)); 

这将避免为O(n)对whereList子句执行searchList时的操作应该接近于O(1)

+0

它将内容与搜索项匹配,所以如果列表中包含“abc def”,并且searchList中包含项“def”,它就没有找到它。 – Adeel 2011-02-01 10:29:34