有沒有一種簡單的方法,無論是通過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
在此先感謝
有沒有一種簡單的方法,無論是通過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
在此先感謝
Intersect
方法將爲您提供兩個列表中的所有元素。
E.g.
var inboth = list1.Intersect(list2);
,或者如果你只是想知道,如果有兩個
if(list1.Intersect(list2).Any()) ...
Intersect
是做到這一點的好辦法。唯一的其他合理的方式就是蠻力它:
list2.All(x => list1.Contains(x));
注意,無論是技術,將工作,如果,例如,list2
是(1 2 2)
和list1
是(1 2 3)
,你想的是回到false
。如果你需要檢查,我會把這兩個清單分類並一起走下去。
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();
這樣,我會把這裏之間的任何共享的元素是天真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%是好的!
希望它有幫助!
相交是完美的。如果你絕望的布爾結果,你可以寫一個自定義擴展方法重寫爲.Contains()
public static bool WholeyContains<T>(this IEnumerable<T> first, IEnumerable<T> second)
{
return second.SequenceEqual(first.Intersect(second));
}
這是錯誤的。如果交叉點是「second」,'first'包含'second',而不是非空。 – mquander 2010-10-12 05:34:08
@mquander:是的,我同意。我想念這個問題。我已經更新了我的答案,以確保第二個列表與交叉點完全相同。 – 2010-10-12 06:18:16
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()
感謝。還有一個問題:如果list2中的所有元素都必須在list1中可用,該怎麼辦?我正在使用Count。有沒有更好的辦法? – Ganesha 2010-10-12 05:42:37
你可以使用像這樣的'除外'if(!list2.Except(list1).Any())...' – 2010-10-12 06:59:08