C#:合并两个列表,不包括重复列表

C#:合并两个列表,不包括重复列表,c#,list,join,concat,C#,List,Join,Concat,获取列表2并将其添加到列表1末尾的简单有效的方法是什么?但是,只有那些在连接之前已在列表1中的项目才会被添加到列表1中 编辑: 我一直在尝试这里的答案中建议的方法,但我仍然在列表1中添加了重复 这是一个代码示例: // Assume the existence of a class definition for 'TheObject' which contains some // strings and some numbers. string[] keywords = {"another"

获取列表2并将其添加到列表1末尾的简单有效的方法是什么?但是,只有那些在连接之前已在列表1中的项目才会被添加到列表1中

编辑: 我一直在尝试这里的答案中建议的方法,但我仍然在列表1中添加了重复
这是一个代码示例:

// 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();
}
//假设存在“TheObject”的类定义,该类定义包含
//字符串和一些数字。
字符串[]关键字={“另一个”、“另一个”、“另一个”};
列表模板列表=新建列表();
List globalList=新列表();
foreach(关键字中的字符串关键字)
{
tempList=//根据返回相关对象列表的代码
//这个迭代的关键字。
globalList=globalList.Union(templast.ToList();
}
调试时-在第二次迭代之后-globalList包含对象的完全相同对象的两个副本。当我尝试实现Edward Brey的解决方案时也会发生同样的事情

EDIT2:
我修改了返回新模板列表的代码,以检查返回的项目是否已经在globalList中(通过执行!globalList.contains())-现在可以工作了

不过,这是一个解决方法…

List1.Union(list2)。有关更多示例,请转到

List1.Union(list2);

如果列表1的所有项都是不同的,LINQ的
联合将起作用。否则,为了更精确地满足所述目标,无需O(m*n)搜索时间,您可以使用哈希集(用列表类型替换
T
):

var intersection=newhashset(List1.Intersect(List2));
List1.AddRange(List2.Where(item=>!intersection.Contains(item));

我试过:List1=List1.Union(List2.toList();在循环中,List2在每次迭代中都是不同的,并且List1中已经存在的项仍然会被添加到循环中……这很奇怪。请尝试List1=List1.Union(List2)。Distinct()对象是否覆盖了Equals?否则,默认值为引用相等,如果每次都新建tempList的项,则该值无效。它是由Linq to SQL从数据库中的表自动生成的类。我查看了定义,没有看到任何等号覆盖。我应该创建一个吗?一个获取两个对象实例并比较其每个属性的实例?或者我是否可以将“按引用相等”的默认值更改为“按值”?假设起始
globalList中没有重复项,您可以使用带有额外参数的
Union
重载,并将值比较语义放入从
IEqualityComparer
派生的类中。
var intersection = new HashSet<T>(List1.Intersect(List2));
List1.AddRange(List2.Where(item => !intersection.Contains(item)));