有人可以解释一下UnionLINQ的工作原理吗?
它被告知它合并两个序列并删除重复.
但我可以以某种方式自定义重复删除行为 - 假设我希望the second sequence在重复或来自的情况下使用该元素the first sequence.
或者即使我希望以某种方式在结果序列中组合这些值?
应该如何实施?
我想我错误地描述了这个问题,假设我们有一些价值:
class Value {
String name
Int whatever;
}
Run Code Online (Sandbox Code Playgroud)
并且使用的比较器执行x.name == y.name检查.
让我们说有时我知道我应该从第二个序列中取出元素,因为它的whatever字段比whatever第一个序列的字段更新/更好.
无论如何,我会使用sequence1.Union(sequence2)或sequence2.Union(sequence1)改变方法.
谢谢
当枚举此方法返回的对象时,Union按该顺序枚举第一个和第二个,并产生尚未产生的每个元素.
http://msdn.microsoft.com/en-us/library/bb341731.aspx
因此,用作左参数的任何序列的元素优先于右参数的元素.
关于这一点的重要一点是,它是明确定义和记录的行为,而不仅仅是在下一版.net中可能会改变的实现细节.
作为一个附注,当你实现一个IEqualityComparer<T>重要的是使用一致Equals和GetHashCode.在这种情况下,我更愿意明确地为union方法提供一个相等比较器,而不是Equals让对象本身返回true对于所有目的都不相同的对象.
如果元素是重复的,那么它们取自哪个列表并不重要 - 除非你的相等比较器当然没有考虑元素的所有属性.
如果它们不是真的重复,那么它们都会出现在最终的联合中.
UPDATE
从您的新信息开始,您应该编写一个考虑whatever到的新的相等运算符.您不能只使用sequence1.Union(sequence2)或sequence2.Union(sequence1)除非所有元素都需要从一个序列或另一个序列中获取.
在极端情况下,您必须编写自己的Union扩展方法,为您执行此操作.