Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用LINQ比较两个列表_C#_Linq - Fatal编程技术网

C# 使用LINQ比较两个列表

C# 使用LINQ比较两个列表,c#,linq,C#,Linq,假设我有这两张名单。Person对象具有FirstName、LastName和Age属性 列举 大卫·史密斯,38岁 大卫·史密斯,38岁 苏珊·约翰逊,23岁 名单B 大卫·史密斯,38岁 大卫·史密斯,38岁 苏珊·约翰逊,23岁 丹尼尔·华莱士,55岁 我想通过比较这三个属性来确定A是否是B的子集。不,在这种情况下,我没有每个人的唯一ID 编辑:列表A中可能有重复项(David Smith,38)。列表B应具有重复项,以符合B的超级集合的资格。如果人员未实现IEquatable则“暴力”方

假设我有这两张名单。Person对象具有FirstName、LastName和Age属性

列举 大卫·史密斯,38岁 大卫·史密斯,38岁 苏珊·约翰逊,23岁

名单B 大卫·史密斯,38岁 大卫·史密斯,38岁 苏珊·约翰逊,23岁 丹尼尔·华莱士,55岁

我想通过比较这三个属性来确定A是否是B的子集。不,在这种情况下,我没有每个人的唯一ID


编辑:列表A中可能有重复项(David Smith,38)。列表B应具有重复项,以符合B的超级集合的资格。

如果
人员
未实现
IEquatable
则“暴力”方法为:

var isSubset = listA.All(pa => listB.Any(pb => pb.FirstName == pa.FirstName &&
                                               pb.LastName == pa.LastName &&
                                               pb.Age == pb.Age
                                        ) 
                        )

一旦你有了一个实现了
IEquatable
IEqualityComparer
的类,那么除了
任何
之外,其余的工作都很容易完成:

if (collectionA.Except(collectionB).Any())
{
    // There are elements in A which aren't in B
}

编辑:如果存在重复项,您可能希望对每个集合进行分组,然后检查计数:

var groupedA = collectionA.GroupBy(p => p,
                                   (Value, g) => new { Value, Count = g.Count() });
var groupedB = collectionB.GroupBy(p => p,
                                   (Value, g) => new { Value, Count = g.Count() });
var extras = from a in groupedA
             join b in groupedB on a.Value equals b.Value into match
             where !match.Any() || a.Count > match.First().Count
             select a;

// ListA has at least one entry not in B, or with more duplicates than in B
if (extras.Any())
{
}
这是非常可怕的…

您可以使用join

var l1 = new List<Person>();//Subset 
var l2 = new List<Person>();//Set of all values

var res = from l1 in lst1
                      join l2 in lst2 
                      on l1.Value equals l2.Value
                      select new { result = l1 };

还有其他房产吗?
Person
是否恰当地实现了
IEquatable
?我的类不完全是Person。但是没有,我正在读关于IEquatable的书。那么我使用什么LINQ操作符呢?包含?这对副本有效吗?我把原来的帖子改成了重复的。要使列表B有资格成为a的超集,它需要有所有的副本。所以你的意思是,如果列表a包含“David Smith,38”三次,那么列表B也需要包含至少三次?是的。我知道这是个可怕的例子。但在我的情况下,B需要包含所有的重复项。@user79284:在我的答案中尝试编辑-但可能有更简单的方法。(在未来,请首先包括这样的重要细节。)
var l1 = new List<Person>();//Subset 
var l2 = new List<Person>();//Set of all values

var res = from l1 in lst1
                      join l2 in lst2 
                      on l1.Value equals l2.Value
                      select new { result = l1 };
bool flag = res.Count()==lst1.Count();