我有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=40
,ItemB=50
,因为ItemA=40
,ItemB=50
缺失
ProductA=20, ProductB=30
ProductA=60, ProductB=80
ProductA=1000, ProductB=2000
答案 0 :(得分:0)
定义两个Dictionaries,一个用于ItemA
,另一个用于ItemB
,它们使用 = 符号后面的数字作为键并为值添加bool。之后,开始浏览您的第二个列表,每当您看到ProductA
或ProductB
的号码时,请将相应词典中的相应键标记为 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
当我们通过所有ProductA
和ProductB
时,我们的词典现在看起来像这样:
DictionaryA DictionaryB
[20]-true [30]-true
[40]-true [50]-true
由于所有键都标记为 true ,因此第一个列表包含在第二个列表中。
现在让我们来看看
ProductA=20, ProductB=30
ProductA=60, ProductB=80
ProductA=1000, ProductB=2000
当我们通过所有ProductA
和ProductB
时,我们的词典现在看起来像这样:
DictionaryA DictionaryB
[20]-true [30]-true
[40]-false [50]-false
因为有些键标记为 false ,所以第一个列表不包含在第二个列表中。
另一个好的(也是更好的)解决方案是使用Hashset而不是使用bool值,只是为了删除密钥。之后,如果该集合不为空,则第一个列表不包含在第二个列表中。
答案 1 :(得分:0)
您只需要结合All
和Any
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
并在其中进行检查。