在C#中,查看列表是否包含其他列表的最佳方法是什么?

时间:2013-10-29 00:47:50

标签: c# linq collections

如果我有一个字符串列表,那么确定另一个列表中的每个元素是否包含在此列表中的最佳方法是什么。例如:

List<string> list = new List<string>();
list.Add("Dog");
list.Add("Cat");
list.Add("Bird");

List<string> list2 = new List<string>();
list.Add("Dog");
list.Add("Cat");

if (list.ContainsList(list2))
{
      Console.Write("All items in list2 are in list1")
}  

我正在尝试确定是否存在类似“ContainsList”方法的内容?

4 个答案:

答案 0 :(得分:6)

if (!list2.Except(list).Any())

答案 1 :(得分:4)

喜欢SLaks版。为了完整起见,您可以在执行集合操作时使用HashSet方法IsSubsetOf(同时检查IsSupersetOf方法)。这种方法有利有弊。下一个代码显示了一个示例:

var list1 = new HashSet<string>{ "Dog", "Cat", "Bird" };

var list2 = new HashSet<string>{ "Dog", "Cat" };

if (list2.IsSubsetOf(list1))
{
      Console.Write("All items in list2 are in list1");
}  

Except方法本质上是流媒体。在查询中list2.Except(list1) list1被完全缓冲到内存中,并且您通过list2一次迭代一个项目。 IsSubsetOf以相反的方式热切地工作。当您拥有大量数据时,这会开始产生影响。


为了分析最坏情况的性能,这里有Except var items = new HashSet<TSource> (second, comparer); //list1.Count foreach (var element in first) //list2.Count if (items.Add (element)) //constant time yield return element; 实现的一些代码(dotPeek给出了非常相似的结果,只是不太可读)

O(list1.Count + list2.Count)

结果为IsSubset,循环不是嵌套的。

IEnumerable有下一个方法调用,如果第二个HashSetprivate bool IsSubsetOfHashSetWithSameEC(HashSet<T> other) { foreach (T obj in this) //list2.Count if (!other.Contains(obj)) //constant time return false; return true; } (通过dotPeek反编译):

O(list2.Count)

如果list1HashSet,则会产生{{1}}。

答案 2 :(得分:0)

怎么样,

var list1 = new List<string>{"Dog","Cat","Bird"};
var list2 = new List<string>{"Dog","Cat"};

if (list1.Union(list2).SequenceEqual(list1))
    Console.Write("All items in list2 are in list1");

答案 3 :(得分:0)

这个怎么样

list1.intersect (list2).ToList ().Foreach ((x)=>
{
Console.Writeline (x)
});