将两个对象列表相交于一个公共属性,然后比较一个不同的属性

时间:2018-12-09 13:40:15

标签: c# list linq ienumerable

我有两个列表

List<objA> List1 List<objA> List2

我想比较ID字段上的这两个列表,一旦找到匹配项,我想比较这两个列表中的另一个字段Distace,并获取值较低的对象。

使用Linq并不是没有给出我想要的结果,至少是问题的第一部分。

var test = List1.Select(x => x.ID) .Intersect(List2.Select(y => y.ID));

1 个答案:

答案 0 :(得分:0)

这是您可以使用Linq完成此操作的一种方法。首先,将两个列表与Union一起加入。然后,按Id字段对它们进行分组。最后,按照分组中的Distance对这些子列表进行排序,并使用每个子列表中的第一个以最小可用距离按Id来获得对象列表。

var aList = new[]
{
    new SomeObject() { Id = 1, Distance = 3 },
    new SomeObject() { Id = 2, Distance = 5 }
};

var bList = new[]
{
    new SomeObject() { Id = 1, Distance = 2 },
    new SomeObject() { Id = 2, Distance = 6 }
};

var results = aList
    .Union(bList)
    .GroupBy(a => a.Id, a => a)
    .Select(a => a.OrderBy(b => b.Distance).First());