如何用LINQ求C#中两个列表的差

如何用LINQ求C#中两个列表的差,c#,linq,C#,Linq,我有两个类似的清单 List<String> LISTONE=new List<String>() 所需的输出是 LISTTEMP "B" "C" "D" "E" 使用LINQ有什么方法可以做到这一点吗?可以使用Except()和Concat()LINQ方法: LISTONE.Except(LISTTWO).Concat(LISTTWO.Except(LISTONE)) 可以使用EXPECT()和

我有两个类似的清单

List<String> LISTONE=new List<String>() 
所需的输出是

LISTTEMP  "B"   
          "C"
          "D"
          "E"
使用LINQ有什么方法可以做到这一点吗?可以使用Except()和Concat()LINQ方法:

LISTONE.Except(LISTTWO).Concat(LISTTWO.Except(LISTONE))
可以使用EXPECT()和Concat()LINQ方法完成此操作:

LISTONE.Except(LISTTWO).Concat(LISTTWO.Except(LISTONE))
编辑:Union方法实现了不同的行为,因此不同的行为是多余的

编辑:Union方法实现不同的行为,因此不同的行为是多余的。

假设您想要“两个列表中都没有出现的所有元素”,在这种情况下,正如我上面提到的,“B”也应该在其中。这是最关键的答案

one.Concat(two).Except(one.Intersect(two))
假设您想要“两个列表中都没有出现的所有元素”,在这种情况下,正如我上面提到的,“B”也应该在其中。这是最关键的答案

one.Concat(two).Except(one.Intersect(two))

“c,d,e”是通过什么机制被选为适当的输出?在上下文中,它们意味着什么?你确定“B”不应该也在其中吗?@Jamiec&David Hedlund:根据什么机制选择了“c,d,e”作为适当的输出?在上下文中,它们意味着什么?你确定“B”不应该也在其中吗?@Jamiec&David Hedlund:这看起来很有希望。这将包括OP的
listtemp
中没有的“B”,但这可能是OP的一个输入错误……这看起来很有希望。这将包括OP的
listtemp
中没有的“B”,但这可能是OP的一部分输入错误…该查询的结果是否会不明显?老实说,我不确定。再想一想,我认为Union实际上是Union(SQL)行为的一个实现,而Concat相当于Union ALL,因此Distinct很可能是多余的。无论Union如何工作,如果您将两个列表合并,其中只包含不在另一个列表中的项,似乎从逻辑上讲,您永远不会以重复的
UNION
UNION ALL
Ah结束,但是假设其中一个列表包含两个相同的项目,而第二个列表中没有出现?我想OP应该收紧他们的问题。这个问题的结果会不会不明显?老实说,我不确定。再想一想,我认为Union实际上是Union(SQL)行为的一个实现,而Concat相当于Union ALL,因此Distinct很可能是多余的。无论Union如何工作,如果您将两个列表合并,其中只包含不在另一个列表中的项,似乎从逻辑上讲,您永远不会以重复的
UNION
UNION ALL
Ah结束,但是假设其中一个列表包含两个相同的项目,而第二个列表中没有出现?我想OP应该收紧他们的提问。
one.Concat(two).Except(one.Intersect(two))