【发布时间】:2011-05-11 19:26:35
【问题描述】:
我只是想从两个列表中删除重复项并将它们合并到一个列表中。我还需要能够定义重复项是什么。我通过 ColumnIndex 属性定义了一个副本,如果它们相同,则它们是重复的。这是我采取的方法:
我找到了一个很好的例子,说明如何为代码段中只需要一次 em 的随机场合编写内联比较器。
public class InlineComparer<T> : IEqualityComparer<T>
{
private readonly Func<T, T, bool> getEquals;
private readonly Func<T, int> getHashCode;
public InlineComparer(Func<T, T, bool> equals, Func<T, int> hashCode)
{
getEquals = equals;
getHashCode = hashCode;
}
public bool Equals(T x, T y)
{
return getEquals(x, y);
}
public int GetHashCode(T obj)
{
return getHashCode(obj);
}
}
然后我只有我的两个列表,并尝试使用比较器对它们进行联合。
var formatIssues = issues.Where(i => i.IsFormatError == true);
var groupIssues = issues.Where(i => i.IsGroupError == true);
var dupComparer = new InlineComparer<Issue>((i1, i2) => i1.ColumnInfo.ColumnIndex == i2.ColumnInfo.ColumnIndex,
i => i.ColumnInfo.ColumnIndex);
var filteredIssues = groupIssues.Union(formatIssues, dupComparer);
但结果集为空。
我会误入歧途吗? 我已经确认这两个列表的列具有相同的 ColumnIndex 属性。
【问题讨论】:
-
只是为了了解这个问题的背景知识,您是否尝试过调试代码并确定调用的是
public bool Equals(T x, T y)方法而不是public int GetHashCode(T obj)方法? -
结果真的是
null,不是空序列?这真的很奇怪,因为Enumerable.Union()永远不应该返回null。
标签: c# linq iequalitycomparer