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按该顺序枚举第一个和第二个,并产生尚未产生的每个元素。
https://msdn.microsoft.com/en-us/library/bb341731.aspx
因此,用作左参数的任何序列的元素优先于右参数的元素。
关于这一点的重要一点是,它是明确定义和记录的行为,而不仅仅是在下一版.net中可能会改变的实现细节。
作为实现IEqualityComparer
的附注,使用一致的Equals
和GetHashCode
很重要。 在这种情况下,我更喜欢明确地为union方法提供一个相等比较器,而不是让对象本身的Equals
对于所有目的不相同的对象都返回true
。
上述就是C#学习教程:C#linq联合问题分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1020368.html