通过LINQ或Generics,有一种简单的方法可以找出一个List中的元素是否在另一个List中都可用。
我目前正在使用Intersect来检查这个。
例如
List<string> list1; //{ 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 }
List<string> list2; //{ 1, 3, 9 }
list1.Contains(list2) == true
提前致谢
答案 0 :(得分:8)
Intersect
方法将为您提供两个列表中的所有元素。
E.g。
var inboth = list1.Intersect(list2);
或者如果您只想知道两者之间是否存在任何共享元素
if(list1.Intersect(list2).Any()) ...
答案 1 :(得分:6)
Intersect
是一个很好的方法。唯一合理的方法就是暴力强迫它:
list2.All(x => list1.Contains(x));
请注意,如果list2
为(1 2 2)
且list1
为(1 2 3)
并且您希望返回false
,则这两种方法都不起作用。如果你需要检查一下,我会对两个列表进行排序并将它们放在一起。
答案 2 :(得分: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();
答案 3 :(得分:1)
Intersect是完美的。如果您对布尔结果感到绝望,可以为.Contains()
public static bool WholeyContains<T>(this IEnumerable<T> first, IEnumerable<T> second)
{
return second.SequenceEqual(first.Intersect(second));
}
答案 4 :(得分: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()
答案 5 :(得分:0)
这样我就放在这里是天真的近似,我不确定是否有更好的方法
//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%好!
希望它有所帮助!