[c#]加入不同的对象列表

标签: Linq Lambda C#
发布时间: 2017/2/28 21:08:41
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我有 2 列表的自定义类型。 他们有一个共同的元素称为 ItemID,我想让所有的元素在哪里它们存在于一个,但不是其他。 有没有人有任何想法吗?

基本上需要的内部联接,相反,但只是想从 itemList 不在 itemCheckoutList 中的元素或完成情况是否属实,他们可以在 itemCheckoutList。 这里是我必须进去两个与完成被虚假的内部联接︰

itemList.Join(itemCheckoutList,
         i => i.ItemID,
         ic => ic.ItemID,
         (i, ic) => new { itemList = i, itemCheckoutList = ic }).Where(x => x.itemCheckoutList.IsComplete == false).ToList();

解决方法 1:

这是你想要什么。

itemList.Where(i => i.IsComplete || 
                    !itemCheckoutList.Any(ic => ic.ItemID == i.ItemID))

编辑

基于您的评论,这是你想要什么。

itemList.Where(i => !itemCheckoutList.Any(ic => ic.ItemID == i.ItemID && 
                                                !ic.IsComplete))

编辑

效率是一个问题,如果要创建查找 itemCheckoutList ,你可以重复使用,或只是改变 itemCheckoutListDictionary<int, CheckOutItem> CodeCaster 的那样。 能够这样做。

// This should preferably be called just once but 
// would need to be called whenever the list changes
var checkOutListLookup = itemCheckoutList.ToLookup(ic => ic.ItemID);

// and this can be called as needed.
var results = itemList.Where(i => !checkOutListLookup.Contains(i.ItemID) ||
                                  checkOutListLookup[i.ItemID].IsComplete);

或如果你让它 Dicionary<int, CheckOutItem> 它会像这样。

var results = itemList.Where(i => !checkOutDictionary.ContainsKey(i.ItemID) ||
                                  checkOutDictionary[i.ItemID].IsComplete);
官方微信
官方QQ群
31647020