【问题标题】:C#: Joining two Lists excluding duplicates [duplicate]C#:加入两个列表,不包括重复项[重复]
【发布时间】:2012-04-27 11:03:50
【问题描述】:

什么是获取 List2 并将其添加到 List1 末尾的简单有效方法 - 但只有那些不 在串联之前已经在 List1 中 - 将被添加到它吗?

编辑: 我一直在尝试这里的答案中建议的方法,但我仍然将欺骗添加到 List1!
这是一个代码示例:

// Assume the existence of a class definition for 'TheObject' which contains some 
// strings and some numbers.

string[] keywords = {"another", "another", "another"};
List<TheObject> tempList = new List<TheObject>();
List<TheObject> globalList = new List<TheObject>();

foreach (string keyword in keywords)
{
    tempList = // code that returns a list of relevant TheObject(s) according to
               // this iteration's keyword.
    globalList = globalList.Union<TheObject>(tempList).ToList();
}

调试时 - 在第二次迭代之后 - globalList 包含完全相同的 TheObject 对象的两个副本。当我尝试实施 Edward Brey 的解决方案时也会发生同样的事情......

EDIT2:
我已经修改了返回新 tempList 的代码,以检查返回的项目是否已经在 globalList 中(通过执行!globalList.contains()) - 它现在可以工作了。
不过,这是一种解决方法...

【问题讨论】:

  • TheObject 是否覆盖了 Equals?否则,默认为引用相等,如果每次都新建 tempList 的项,这将不起作用。
  • 这是一个由 Linq 从数据库中的表自动生成到 SQL 的类。我查看了定义,没有看到任何 Equals 覆盖。我应该创建一个吗?一个接受两个对象实例并比较它们的每个属性?
  • 或者我可以以某种方式将“按引用相等”的默认值更改为“按值”吗?
  • 假设您的起始globalList 中没有重复项,您可以使用带有额外参数的Union 重载并将值比较语义放在您从IEqualityComparer 派生的类中。

标签: c# list join concat


【解决方案1】:

List1.Union(list2)。更多示例请转至http://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b

【讨论】:

  • 我试过了:List1 = List1.Union(List2).toList();在 List2 在每次迭代中都不同的循环中 - 并且已经在 List1 中的项目仍会被添加到其中...
  • 这很奇怪。试试 List1 = List1.Union(List2).Distinct()
【解决方案2】:

你可以像使用 List 的 Union 方法

List1.Union(list2);

【讨论】:

    【解决方案3】:

    如果 List1 的所有项目都不同,LINQ 的 Union 将起作用。否则,为了更准确地达到既定目标,而不需要 O(m*n) 搜索时间,您可以使用哈希集(将 T 替换为您的列表类型):

    var intersection = new HashSet<T>(List1.Intersect(List2));
    List1.AddRange(List2.Where(item => !intersection.Contains(item)));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-13
      • 1970-01-01
      • 2014-10-08
      • 2015-07-20
      • 2022-12-24
      • 1970-01-01
      相关资源
      最近更新 更多