【问题标题】:How to combine two lists<Class> without duplicates in one of variables如何在变量之一中组合两个列表<Class>而没有重复项
【发布时间】:2016-12-06 16:12:27
【问题描述】:

我有两个列表:

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"

我们看到,title item 被 list2 中的 item 替换了。

获得这种结果的最佳方法可能是使用 LINQ。有人知道这样做的热门方法吗?

【问题讨论】:

  • ID = 4, Title = "d"在哪里?
  • 被列表2中的字符串替换,因为它们的ID相同
  • 您的要求不完整。如果两者都包含 ID(第二个列表中的项目),您想要什么?你想要两个列表的“完全外连接”吗?如果两个列表都包含多个具有相同 ID 的项目怎么办?
  • 那是不可能的,两个列表可以有相同的ID,但在单个列表中ID是唯一的。
  • 你能回答我所有的问题吗?

标签: c# performance linq list


【解决方案1】:

组合列表,按 id 分组,然后从组中选择最后一项(如果有多个匹配项,它将是 list2 中的项目)。

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

【讨论】:

    【解决方案2】:

    由于您从第一个列表中省略了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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-17
      • 2014-03-28
      • 2013-02-16
      • 2014-08-30
      相关资源
      最近更新 更多