2013-02-25 28 views
3

進出口尋找一個快速的方法來調用IList.Contains一個字符串數組參數IList.Contains(string [])如何在C#中?

有沒有辦法做到這一點:

val[] = {"first", "second"} 

var temp = from i in items 
      where i.list.Contains(val) 
      select i; 
+2

你的意思是 「既包含」 或 「包含任何」? – 2013-02-25 13:12:16

+0

[linq where list contains any list in]的可能重複(http://stackoverflow.com/questions/10667675/linq-where-list-contains-any-in-list) – 2013-02-25 13:12:32

回答

6

如果你想檢查是否i.list包含要麼"first""second"

var val = new [] { "first", "second" }; 
var temp = from i in items 
      where val.Any (i.list.Contains) 
      select i; 

如果你想檢查是否i.list包含"first""second"

var val = new [] { "first", "second" }; 
var temp = from i in items 
      where val.All (i.list.Contains) 
      select i; 

但是,如果性能至關重要(認爲在數百個物品的循環中稱爲),則使用HashSet交叉口as advised by Hermit會更合適。

+0

任何聲明正是我一直在尋找。非常感謝。 – 2013-02-25 13:59:17

5
var temp = from i in items 
      where i.list.Any(x => val.Contains(x)) 
      select i; 

使用All如果所有列表項應該是值

3

我在LINQ上真的很糟糕,所以我不打算解決這個問題。

首先做一個包含在列表中並不是最快的事情。在列表上做一個LINQ並不是爲了讓它更快。你需要做的是有一個HashSet,然後做一個Contains。如果你有兩個列表,我會說創建兩個HashSets並相交它們。

http://msdn.microsoft.com/en-us/library/vstudio/bb918911(v=vs.90).aspx

1

不確定你的意思是'包含',如果你想要所有匹配的項目,@ lazyberezovsky的答案應該是正確的。

但是,如果你想overrride IList.Contains支持數組(或可枚舉),你可以這樣做:

/// <summary> 
    /// Return true if <paramref name="allItems"/> 
    /// contains one or more <paramref name="candidates"/> 
    /// </summary> 
    public static bool Contains<T>(IList<T> allItems, IEnumerable<T> candidates) 
    { 
     if (null == allItems) 
      return false; 

     if (null == candidates) 
      return false; 

     return allItems.Any(i => candidates.Contains(i)); 
    } 
1

下面是一個擴展方法來獲得是否有任何數組元素的存在列表。這一個返回一個boolIList.Contains

public static class IListExtensions 
{ 
    public static bool ContainsAny<T>(this IList<T> list, IEnumerable<T> enumerable) 
    { 
     foreach (var item in enumerable) 
     { 
      if (list.Contains(item)) 
       return true; 
     } 
     return false; 
    } 
} 

用法:

IList<int> a = // ... 
string[] b = // ... 

a.ContainsAny(b); 
相關問題