【问题标题】:How to get Unique objects from two lists in c#?如何从 C# 中的两个列表中获取唯一对象?
【发布时间】:2016-06-10 15:41:32
【问题描述】:

我有两个类似的列表对象

list1   =[{"id":"101","name":"one"},{"id":"102","name":"two"},{"id":"103","name":"three"}]
list2   =[{"id":"111","name":"one"},{"id":"112","name":"two"},{"id":"114","name":"four"},{"id":"115","name":"five"}]

在上述两个列表中包含重复的名称值。现在我想根据名称属性获取唯一的名称对象。 输出:-

result   =[{"id":"103","name":"three"},{"id":"114","name":"four"},{"id":"115","name":"five"}]

【问题讨论】:

  • 您展示了 JSON 语法,但已将您的问题标记为 C#。您能否详细说明这些是 C# 列表还是 JSON 列表,以及您尝试解决的问题?
  • 您可以连接两个列表,然后 GroupBy(x => x.name) 并获取 Count == 1 的值,尽管如果您的对象有 IEqualityComparer,那么还有其他选择,例如组合 .Except() 和 @ 987654327@

标签: c# asp.net-mvc


【解决方案1】:

您可以使用Linq 扩展函数来执行此操作。

var result = list1.Concat(list2)
     .GroupBy(x=>x.name)
     .Where(x=>x.Count() == 1)
     .Select(x=>x.FirstOrDefault())
     .ToList();     

【讨论】:

    【解决方案2】:
    var common = list1.Select(a => a.name).Intersect(list2.Select(b => b.name));
    

    【讨论】:

    • 这里只选择name属性(OP要对象)
    【解决方案3】:

    假设你有 JSON 反序列化过程后的模型列表:

    var list1 = new List<Model>();
    var list2 = new List<Model>();
    

    由于您需要删除每个列表中相交的所有元素并返回唯一元素,因此请使用 except 或 RemoveAll:

    var target = list1.Except(list2);
    
    // or use:
    var target = list1.RemoveAll(item => list2.Contains(item));
    

    使用HashSet的另一种方式:

    var hashSet = new HashSet<Model>(list2);
    list1.RemoveAll(item => hashSet.Contains(item));
    

    参考:Remove elements from one List<T> that are found in another

    【讨论】:

      猜你喜欢
      • 2022-06-22
      • 2014-11-20
      • 1970-01-01
      • 2017-08-08
      • 2015-02-11
      • 1970-01-01
      • 2011-10-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多