如何在一个变量中组合两个列表<class>而不重复

时间:2016-08-01 14:20:14

标签: c# performance linq list

我有两个清单:

public class ListTemplate
{
    public decimal Id { get; set; }
    public string Title { get; set; }
}

public List<ListTemplate> List1 = new List<ListTemplate>();
public List<ListTemplate> List2 = new List<ListTemplate>();

清单1:

ID = 1, Title = "a"
ID = 2, Title = "b"
ID = 3, Title = "c"
ID = 4, Title = "d"

清单2:

ID = 3, Title = "c"
ID = 4, Title = "ab"
ID = 5, Title = "a"
ID = 6, Title = "a"

我想得到结果:

ID = 1, Title = "a"
ID = 2, Title = "b"
ID = 3, Title = "c"
ID = 4, Title = "ab"
ID = 5, Title = "a"
ID = 6, Title = "a"

我们看到,使用list2中的项目替换了标题项目。

使用LINQ时,最好的方法是获得这样的结果。有人知道这样做的好方法吗?

2 个答案:

答案 0 :(得分:1)

由于您从第一个列表中省略了ID = 4, Title = "d",我假设您要从list1 + list2中获取所有项目,如果两个列表中都存在ID,请从第二个列表中取一个。

然后使用Except + Concat的这种方法有效:

var idOnlyList1 = List1.Select(x => x.Id).Except(List2.Select(x => x.Id));
var templates1 = from id in idOnlyList1 join lt1 in List1 on id equals lt1.Id select lt1;
List<ListTemplate> result = templates1.Concat(List2).ToList();

答案 1 :(得分:1)

合并列表,ID上的组,然后选择组中的最后一项(如果多个匹配,它将是list2中的项目)。

var q = list1.Concat(list2).GroupBy(x => x.Id).Select(x => x.Last());