2012-01-23 42 views
6

我有两个阵列idxListResponse & _index两者都具有相同的结构。c#linq - 从阵列中获取不存在于不同阵列中的元素

每个阵列包含许多元件的具有不同特性的其中之一是被称为indexdata

这个阵列的每个元件的子阵列具有许多属性的其中之一是被称为数据字段另一个阵列。这具有许多关键值对特性。

所以在本质上我有3个独立数组的层次结构。

我正在寻找获得层次结构的第一层次+第二层次的所有元素,其中第三层次的物品不匹配,即仅排除那些第三层次物品匹配的第二层次的物品。

我已经尝试过接近这一些不同的方式,但到目前为止我没有得到任何地方,任何人都可以帮助。

仅供参考 - 这是我最新的尝试

var q = idxListResponse.Index.Where(a => 
    a.IndexData.All(b => 
     b.DataField.All(c => 
      _index.Index.Where(z => 
       z.IndexData.All(y => y.DataField.Contains(c.name)) 
      ) 
     ) 
    ) 
); 

回答

23

Except是这样做的一个好办法:

var items = source1.Except(source2); 

会在source1返回的所有项目,除了那些source2

由于您的收藏似乎是不同的类型,你会做这样的事情:

source1.Except(source2.Select(s => /* selector here */)) 

或者你可以创建自己的实现的IEqualityComparer并用它来比较两种不同的类型。

+0

谢谢,但只是不能得到那个工作。问题是如果第三个数组中的某个元素的某个属性匹配,那么该数组似乎正在被丢弃。我需要第三个数组中每个元素的所有属性以匹配相应的条目,然后才能将其删除 – Johnv2020