2010-10-12 83 views
2

有沒有一種簡單的方法,無論是通過LINQ或泛型,找出一個列表中的元素是否都在另一個列表中可用。C#List <string>「contains」question

我目前使用Intersect來檢查這一點。

例如,

List<string> list1; //{ 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 } 

List<string> list2; //{ 1, 3, 9 } 

list1.Contains(list2) == true 

在此先感謝

回答

8

Intersect方法將爲您提供兩個列表中的所有元素。

E.g.

var inboth = list1.Intersect(list2); 

,或者如果你只是想知道,如果有兩個

if(list1.Intersect(list2).Any()) ... 
+0

感謝。還有一個問題:如果list2中的所有元素都必須在list1中可用,該怎麼辦?我正在使用Count。有沒有更好的辦法? – Ganesha 2010-10-12 05:42:37

+2

你可以使用像這樣的'除外'if(!list2.Except(list1).Any())...' – 2010-10-12 06:59:08

6

Intersect是做到這一點的好辦法。唯一的其他合理的方式就是蠻力它:

list2.All(x => list1.Contains(x)); 

注意,無論是技術,將工作,如果,例如,list2(1 2 2)list1(1 2 3),你想的是回到false。如果你需要檢查,我會把這兩個清單分類並一起走下去。

2
var list1 = new [] {5, 4, 1, 3, 9, 8, 6, 7, 2}; 
var list2 = new[] {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5}; 

var hasItems = list1.Where(x => list2.Contains(x)).Any(); 
0

這樣,我會把這裏之間的任何共享的元素是天真aproximation,林不知道是否有更好的方法

//Checks if list1 is contained in list2 
public bool ContainsList(List<T> list1, List<T> list2) 
{ 

    for (int i = 0; i < list1.Count; i++) 
    { 
    bool inside = false; 

    for (int j = 0; j < list2.Count; j++){ 
     if (list1[i] == list2[j]) 
     inside = true; 
    } 

    //found one in list1 that is not on list2! 
    if (!inside) 
     return false; 
    } 
} 

這個答案的計算成本是O(n * m),其中n和m是列表的長度。不是LINQ,不是最好的方法,但是100%是好的!

希望它有幫助!

1

相交是完美的。如果你絕望的布爾結果,你可以寫一個自定義擴展方法重寫爲.Contains()

public static bool WholeyContains<T>(this IEnumerable<T> first, IEnumerable<T> second) 
    { 
     return second.SequenceEqual(first.Intersect(second)); 
    } 
+0

這是錯誤的。如果交叉點是「second」,'first'包含'second',而不是非空。 – mquander 2010-10-12 05:34:08

+0

@mquander:是的,我同意。我想念這個問題。我已經更新了我的答案,以確保第二個列表與交叉點完全相同。 – 2010-10-12 06:18:16

1
var a = new int[]{ 1, 2, 3 }; 
var b = new int[] { 1, 2, 3, 4, 5 }; 

bool result = (from numA in a 
       join numB in b 
       on numA equals numB 
       into joined 
       select joined).Count().Equals(a.Count()); // or b.Count()