检查以查看1列表中的所有项目是否在另一个列表中

时间:2014-06-07 17:19:56

标签: vb.net linq

我有2个列表

  • 第一个有2个属性ItemA和ItemB

  • 第二个属性有2个属性ProductA和ProductB

在我的第一个列表中,我填充了

ItemA=20, ItemB=30
ItemA=40, ItemB=50
ItemA=60, ItemB=80

我正在寻找一种方法来检查包含所有项目的Product列表 项目清单(顺序无关紧要,额外内容无关紧要),即

  • 会返回 true

    ProductA=40, ProductB=50
    ProductA=20, ProductB=30
    ProductA=60, ProductB=80
    ProductA=1000, ProductB=2000  
    
  • 将返回 false 并打印ItemA=40ItemB=50,因为ItemA=40ItemB=50缺失

    ProductA=20, ProductB=30
    ProductA=60, ProductB=80
    ProductA=1000, ProductB=2000
    

2 个答案:

答案 0 :(得分:0)

定义两个Dictionaries,一个用于ItemA,另一个用于ItemB,它们使用 = 符号后面的数字作为键并为值添加bool。之后,开始浏览您的第二个列表,每当您看到ProductAProductB的号码时,请将相应词典中的相应键标记为 true 。之后,浏览两个词典,如果有 false 键,则所有项目构成第二个列表中包含的第一个列表。简短的例子:

我们有

ItemA=20, ItemB=30
ItemA=40, ItemB=50

现在我们定义了2个词典。现在我们有DictionaryA

[20]-false
[40]-false

DictionaryB

[30]-false
[50]-false

现在让我们来看看

ProductA=40, ProductB=50
ProductA=20, ProductB=30
ProductA=60, ProductB=80
ProductA=1000, ProductB=2000

当我们通过所有ProductAProductB时,我们的词典现在看起来像这样:

DictionaryA     DictionaryB
[20]-true      [30]-true
[40]-true      [50]-true

由于所有键都标记为 true ,因此第一个列表包含在第二个列表中。


现在让我们来看看

ProductA=20, ProductB=30
ProductA=60, ProductB=80
ProductA=1000, ProductB=2000

当我们通过所有ProductAProductB时,我们的词典现在看起来像这样:

DictionaryA     DictionaryB
[20]-true       [30]-true
[40]-false      [50]-false

因为有些键标记为 false ,所以第一个列表包含在第二个列表中。


另一个好的(也是更好的)解决方案是使用Hashset而不是使用bool值,只是为了删除密钥。之后,如果该集合不为空,则第一个列表包含在第二个列表中。

答案 1 :(得分:0)

您只需要结合AllAny linq方法(抱歉C#)

var items = new[]
    {
        new {ItemA = 20, ItemB = 30},
        new {ItemA = 40, ItemB = 50},
        new {ItemA = 60, ItemB = 80},
    };
var products1 = new[]
    {
        new {ProductA = 40, ProductB = 50},
        new {ProductA = 20, ProductB = 30},
        new {ProductA = 60, ProductB = 80},
        new {ProductA = 1000, ProductB = 2000},
    };
var products2 = new[]
    {
        new {ProductA = 20, ProductB = 30},
        new {ProductA = 60, ProductB = 80},
        new {ProductA = 1000, ProductB = 2000}
    };

items.All(i => products1
            .Any(p => p.ProductA == i.ItemA && p.ProductB == i.ItemB)); // true
items.All(i => products2
            .Any(p => p.ProductA == i.ItemA && p.ProductB == i.ItemB)); // false

对于您的所有items,至少应该有来自具有匹配属性的products出口的项目。

如果您还要收集缺失的项目,也可以在All谓词中执行此操作:

var missing = new List<object>();
items.All(i =>
    {
        if (products1.Any(p => p.ProductA == i.ItemA && p.ProductB == i.ItemB))
            return true;
        //no matching item has found so add it to the missing "list"
        missing.Add(i);
        return false;
    });

但是,如果您开始在LINQ方法中修改状态,那么它们可能不是最佳解决方案,因此您最好有两个嵌套foreach并在其中进行检查。

相关问题