我有2个自定义类型列表。它们具有一个称为ItemID的公共元素,我想获取所有元素在一个元素中存在的位置,而在另一个元素中不存在。有人有什么想法吗?

我基本上需要一个内部联接的相反方法,但是只希望itemListoutList中没有的itemList中的元素,或者如果IsComplete为true,它们可以在itemCheckoutList中。这是内部连接,我必须同时将IsComplete设置为false:

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

最佳答案

我相信这就是您想要的。

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创建一个可重复使用的查询,或者按照CodeCaster的建议将itemCheckoutList更改为Dictionary<int, CheckOutItem>。可以这样做。

// 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);

07-27 19:35