C#林克联盟问题
有人能解释一下LINQ中的C#林克联盟问题,c#,linq,union,C#,Linq,Union,有人能解释一下LINQ中的Union是如何工作的吗 它被告知它合并了两个序列并删除了重复序列 但是我是否可以定制重复删除行为?比如说,如果我希望在重复的情况下使用第二个序列中的元素,或者使用第一个序列中的元素 或者即使我希望以某种方式将这些值组合到结果序列中 应该如何实施 更新 我想我对问题的描述不正确,假设我们有一些价值: class Value { String name Int whatever; } 使用的比较器执行x.name==y.name检查 假设有时候我知道我应该
Union
是如何工作的吗
它被告知它合并了两个序列并删除了重复序列
但是我是否可以定制重复删除行为?比如说,如果我希望在重复的情况下使用第二个序列中的元素,或者使用第一个序列中的元素
或者即使我希望以某种方式将这些值组合到结果序列中
应该如何实施
更新 我想我对问题的描述不正确,假设我们有一些价值:
class Value {
String name
Int whatever;
}
使用的比较器执行x.name==y.name
检查
假设有时候我知道我应该从第二个序列中提取元素,因为它是which
字段,比第一个序列的which
字段更新/更好
无论如何,我会使用sequence1.Union(sequence2)
或sequence2.Union(sequence1)
方法的变体。
谢谢如果元素是重复的,那么从哪个列表中获取它们并不重要,当然,除非您的相等比较器没有考虑元素的所有属性 如果它们不是真正的重复项,那么它们都将出现在结果并集中 更新 您至少应该根据新信息编写一个新的等式运算符,该运算符考虑
任何内容。不能只使用sequence1.Union(sequence2)
或sequence2.Union(sequence1)
,除非所有元素都要从一个序列或另一个序列中提取
在极端情况下,您必须编写自己的Union
扩展方法来实现这一点。您可以使用second.Union(first)
而不是first.Union(second)
。这样,它将保留第二个
中的项目,而不是第一个
中的项目
枚举此方法返回的对象时,Union按顺序枚举第一个和第二个对象,并生成尚未生成的每个元素。
因此,无论使用哪个序列作为左参数,其中的元素优先于右参数中的元素
关于这一点,重要的是,它是定义良好并有文档记录的行为,而不仅仅是在下一版本的.net中可能更改的实现细节
在实现IEqualityComparer
时,使用一致的Equals
和GetHashCode
非常重要。在这种情况下,我更喜欢显式地为union方法提供一个相等比较器,而不是让对象本身的Equals
对于并非所有目的都相同的对象返回true
。这取决于如何定义相等。。。如果类型实现了IEquatable
(或OP显式指定的相等比较器),则比较可能没有考虑所有成员。@Thomas-这在我的回答中暗示了。也许我应该把它说清楚。@Thomas-我的编辑是由你的评论提示的,但在5分钟内;)谢谢,这是所需要的信息:特别是,对可能是“神秘的黑匣子行为”的信心事实上是有记录的,如果不大张旗鼓的话不会改变——想必,根本不会改变。