编辑,只是说ContainsAllItem中的注释解释得最好。
对不起要问,我知道之前有人问过这个问题,但我只是没有得到它。 好的,所以我想检查一个列表是否包含另一个列表 WITHOUT 重叠的所有项目,以及根据类字符串比较项目,名称变量(称为itemname,它是公共的)。 / p>
public class Item
{
public string itemname;
}
所以基本上,有一个类(比如说..类A)带有一个项目列表,一个函数检查获取类A的项目列表,然后将它与另一个列表进行比较(让我们称之为B) ,但比较项目名称变量而不是整个项目。
最重要的是,你能否详细解释它的作用。
那么函数/类现在看起来如何。
public class SomeClass
{
public List<Item> myItems = new List<Item>();
public bool ContainsAllItems(List<Item> B)
{
//Make a function that compares the to lists by itemname and only returns true if the myItems list contains ALL, items in list b.
//Also could you explain how it works.
}
}
答案 0 :(得分:9)
我还没有检查过pref,但是linq确实有Except运算符。
var x = new int[] {4,5};
var y = new int[] {1 ,2 ,3 ,4 ,5};
y.Except(x).Any(); //true, not all items from y are in x
x.Except(y).Any(); // false, all items from x are in y
答案 1 :(得分:8)
这不完全是你所要求的,但性能明智,你绝对应该使用HashSet
的IsProperSubsetOf
。它可以在数量级更短的时间内完成您想要的任务:
HashSet<string> a = new HashSet<string>(list1.Select(x => x.itemname));
HashSet<string> b = new HashSet<string>(list2.Select(x => x.itemname));
a.IsProperSubsetOf(b)
说明: HashSet
使用项目的GetHashCode
值和Equals
方法以有效的方式比较项目。这意味着当它在内部遍历b
中的值时,它不必将其与a中的所有其他项进行比较。它使用哈希代码(和内部哈希函数)来检查它是否已经具有该值或不具有该值。
因为它只对每个项目进行一次检查(每次检查都是O(1)),所以比检查a
中需要O(n)的所有项目要快得多(对于b
中的每个项目,都是。
答案 2 :(得分:4)
B.All(itB=>myItems.Select(itA=>itA.ItemName).Contains(itB.ItemName))
将在O(N ^ 2)时间内运行,但是你可以在一条相当难以理解的线上做到这一点很酷。
答案 3 :(得分:0)
这是另一种方式。我提供了一种包含和排除列表比较的方法。
var a = new List<int> { 1, 2, 3, 4, 5 };
var b = new List<int> { 1, 2, 3 };
//Exists in list a but not in b
var c = (from i
in a
let found = b.Any(j => j == i)
where !found select i)
.ToList();
//Exists in both lists
var d = (from i
in a
let found = b.Any(j => j == i)
where found select i)
.ToList();