编辑:为什么 Union() 没有像它应该的那样排除重复项?
在提出原始问题之前,我应该阅读文档。我没有,因为每次我使用 Union() 时都是在没有覆盖 Equals() 和 GetHashCode() 的对象列表上,所以即使列表中每个对象的字段值相同,它们将在创建的新列表 Union() 内。起初,似乎 Union() 没有排除重复项,而我认为这是真的。但实际上, Union() 确实排除了重复项。不仅在两个列表中重复,而且在同一个列表中也重复。如果我的对象不覆盖 Equals() 和 GetHashCode() 它们不会按值进行比较,这意味着它们看起来不是重复的。
这是让我问这个问题的困惑。
一旦我使用 Union() 和 Select() 显式地创建了一个新列表,“T”将成为一个匿名类型,按值进行比较。这样,具有相同字段值的对象将被视为重复。这就是导致 Union() 表现不同(或者看起来表现不同)的原因。它总是排除重复项,但并不总是按值比较类型,因此具有相同字段值的对象可能会或可能不会看起来是重复的。这取决于您的自定义类的实现。
我想这应该是一个问题:为什么 Union() 没有像它应该的那样排除重复项?(正如我们所见,这是因为我的对象并不是真正的重复项)。那正确吗?
原始问题: LINQ Union + Select 会自动删除重复项。为什么?
我一直认为 Linq 中的 Union() 会返回两个列表中的所有值,即使它们相同。但是当我在 Union() 之后使用“Select()”时,我的代码正在从第一个列表中删除重复项。
想象一下球提取的经典概率问题,我有不同的容器,我从容器中提取一些不同的球。
我有两个 BallExtraction 列表。每个列表都显示了球的 ID、球所在容器的 ID、我提取的球数(值)及其颜色。但是,出于某种原因,我有两个不同的列表,我想合并它们。
示例代码:
class BallExtraction
{
public enum BallColor
{
Blue = 0,
Red = 1
}
public int Id { get; set; }
public int IdContainer { …Run Code Online (Sandbox Code Playgroud)