C#linq联合问题

有人可以解释一下LINQ中的Union是如何工作的吗?

它被告知它合并两个序列并删除重复。

但我可以以某种方式自定义重复删除行为 – 假设我希望在重复或the first sequence情况下使用the second sequence中的元素。

或者即使我希望以某种方式在结果序列中组合这些值?

应该如何实施?


更新

我想我错误地描述了这个问题,让我们说我们有一些价值:

 class Value { String name Int whatever; } 

并且使用的比较器执行x.name == y.name检查。

让我们说有时我知道我应该从第二个序列中取出元素,因为它是whatever字段比第一个序列的whatever字段更新/更好。

无论如何,我会使用sequence1.Union(sequence2)sequence2.Union(sequence1)方法的变体。

谢谢

您可以使用second.Union(first)而不是second.Union(first) first.Union(second) 。 这样,它将保留second而不是第一个项目。

如果元素是重复的,那么它们取自哪个列表并不重要 – 除非你的相等比较器当然没有考虑元素的所有属性。

如果它们不是真的重复,那么它们都会出现在最终的联合中。

UPDATE

从您的新信息开始,您应该编写一个新的相等运算符,它将whatever考虑在内。 您不能只使用sequence1.Union(sequence2)sequence2.Union(sequence1)除非所有元素都需要从一个序列或另一个序列中获取。

在极端情况下,您必须编写自己的Union扩展方法,为您执行此操作。

当枚举此方法返回的对象时,Union按该顺序枚举第一个和第二个,并产生尚未产生的每个元素。
http://msdn.microsoft.com/en-us/library/bb341731.aspx

因此,用作左参数的任何序列的元素优先于右参数的元素。

关于这一点的重要一点是,它是明确定义和记录的行为,而不仅仅是在下一版.net中可能会改变的实现细节。

作为实现IEqualityComparer的附注,使用一致的EqualsGetHashCode很重要。 在这种情况下,我更喜欢明确地为union方法提供一个相等比较器,而不是让对象本身的Equals对于所有目的不相同的对象都返回true