C#List <string>“包含”问题</string>

时间:2010-10-12 05:24:49

标签: .net generics list

通过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

提前致谢

6 个答案:

答案 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%好!

希望它有所帮助!