Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#林克联盟问题_C#_Linq_Union - Fatal编程技术网

C#林克联盟问题

C#林克联盟问题,c#,linq,union,C#,Linq,Union,有人能解释一下LINQ中的Union是如何工作的吗 它被告知它合并了两个序列并删除了重复序列 但是我是否可以定制重复删除行为?比如说,如果我希望在重复的情况下使用第二个序列中的元素,或者使用第一个序列中的元素 或者即使我希望以某种方式将这些值组合到结果序列中 应该如何实施 更新 我想我对问题的描述不正确,假设我们有一些价值: class Value { String name Int whatever; } 使用的比较器执行x.name==y.name检查 假设有时候我知道我应该

有人能解释一下LINQ中的
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分钟内;)谢谢,这是所需要的信息:特别是,对可能是“神秘的黑匣子行为”的信心事实上是有记录的,如果不大张旗鼓的话不会改变——想必,根本不会改变。