【发布时间】: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派生的类中。