gpt4 book ai didi

c# - LINQ 查询以在与通用列表不同的列表之间进行选择

转载 作者:太空宇宙 更新时间:2023-11-03 18:44:27 26 4
gpt4 key购买 nike

我有两个通用列表,我想在其中运行几个 Linq 查询来找出答案:

  1. 是否在列表 B 中找到列表 A 中的任何项目

  2. 是否在列表 B 中找到列表 A 的所有项目

列表如下:

var ListA = new List<long>()
var ListB = new List<MyObject>()

MyObject 定义为:

public class MyObject
{
public long ItemId { get; set; }
// ... Other stuff...
}

我试图确定两件事(两个查询):1. ListA 中的任何 long 是否匹配 ListB 中的任何 MyObject.ItemId?以及2. ListA中的long能否全部在ListB中找到?

ListA 和 ListB 的长度可以不同。对于数字 2,我需要在 ListB 中找到的 ListA 的所有项目,但反之则不然。我希望这是有道理的。

谢谢,

-斯科特

最佳答案

首先,您只关心 ListB 中的 ItemId,因此:

var bIDs = ListB.Select(x => x.ItemId);

为了回答您问题的第一部分,我将通过找到两个列表(它们共享的所有项目的集合)的交集来解决这个问题。如果其中至少有一个元素,则两者之间存在重叠。

var sharedIds = ListA.Intersect(bIDs);
if (sharedIds.Any())
// list A contains at least one ItemID which ListB contains

至于第二部分,您想查看列表 A 是否是列表 B 的子集。为此,Stack Overflow 提供了 clean solution。 :

if (!ListA.Except(bIDs).Any())
// yes, list A is a subset of list B

此代码段之所以有效,是因为 ListA.Except(bIDs) 找到了 ListA 具有而 bIDs 没有的元素。如果这是空的,则 ListA 不包含 bIDs 不包含的任何内容。因此,ListA 中的所有内容也在 bIDs 中。

这是一个例子:A = {1, 2}; B = {1, 2, 3}。 A 是 B 的一个子集。A.Except(B) 给你一个空集 - B 有 1 和 2,所以不能在结果列表中,并且没有任何剩余在 B 中。因此,当 A 是 B 的子集时,A.Except(B).Any() 给出 false,因为结果中没有元素;所以如果我们想处理这种情况,我们显然会否定它。

为了完整起见,如果我们交换 A 和 B 轮使得 A 不是 B 的子集:A = {1, 2, 3}; B = {1, 2},然后 A.Except(B) 给出 {3}。它不能包含 1 或 2,因为 B 包含 1 和 2。但是 B 不包含 3,所以 A.Except(B) 可以 包含它。由于 {3} 包含一个元素,它不为空,因此 A.Except(B).Any() 为真。取反,如果 A 不是 B 的子集则为假。

我的解释有点简洁;如果您想进一步查找(我建议您这样做 - 一点集合论可以大有帮助),A.Except(B) 是 LINQ 对集合差异或相对集合的名称补充。 Wikibooks 有一个不错的 introduction如果您愿意,可以设置理论。

关于c# - LINQ 查询以在与通用列表不同的列表之间进行选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5656445/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com