如果我有一个字符串列表,那么确定另一个列表中的每个元素是否包含在此列表中的最佳方法是什么。例如:
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”方法的内容?
答案 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
有下一个方法调用,如果第二个HashSet
是private 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)
如果list1
是HashSet
,则会产生{{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)
});