检查列表是否包含其他列表。 C#

时间:2014-01-25 20:49:04

标签: c# .net

编辑,只是说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.
    }
}

4 个答案:

答案 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)

这不完全是你所要求的,但性能明智,你绝对应该使用HashSetIsProperSubsetOf。它可以在数量级更短的时间内完成您想要的任务:

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();