使用C#lambda查找集合中不匹配的元素

时间:2014-10-10 00:11:01

标签: c# linq lambda

我从函数中获得了两个集合:

IEnumerable<InventoryItem> inventoryItems = get();
IEnumerable<InventoryItem> relatedItems = get();

我想为每个库存项目分配相关项目。但是,相关项目不能与库存项目本身匹配。含义库存物品不能用于相关物品。

我试图以这种方式跳过集合中的重叠元素:

foreach (var item in inventoryItems)
    {
      InventoryItem item1 = item;
      relatedItems.SkipWhile(x => x.RelatedItems.Contains(item1)).ForEach(i => item1.RelatedItems.Add(i));
      Save(item);
    }

这似乎不起作用。你们中的任何一个Linq用户都有更好的建议。 我遇到的问题是SkipWhile(x => x.RelatedItems.Contains(item1))部分。另一部分在匹配项目时起作用,无论它们是否重叠

3 个答案:

答案 0 :(得分:0)

带有负面条件的

Where应该过滤掉您不需要的唯一项目(请注意,可能需要使用检查项目标识的其他条件替换co !=的comapison“

    item1.RelatedItems = relatedItems
         .Where(x => !x.RelatedItems.Any(r => r!= item1)).ToList();

答案 1 :(得分:0)

试试这个:

    public IEnumerable<T> GetNotMatchingElements<T>(IEnumerable<T> collection1, IEnumerable<T> collection2)
    {
        var combinedCollection = collection1.Union(collection2);
        var filteredCollection = combinedCollection.Except(collection1.Intersect(collection2));
        return filteredCollection;
    }

答案 2 :(得分:0)

不确定我完全理解,但如果我这样做,这应该有效:

foreach (var invItem in inventoryItems)
{
    invItem.RelatedItems = relatedItems
        .Where(relItem => !relItem.RelatedItems.Contains(invItem)));
    Save(invItem);
}