简单的IEqualityComparer <t>问题</t>

时间:2011-05-12 16:21:53

标签: c#

我正在尝试从包含通用对象的列表中删除重复的条目。

public class MessageInfo
{
    public DateTime Date { get; set; }
    public string To { get; set; }
    public string Message { get; set; }
}

public class SMSDupeRemover : IEqualityComparer<MessageInfo>
{
    public bool Equals(MessageInfo x, MessageInfo y)
    {
        throw new NotImplementedException();
    }

    public int GetHashCode(MessageInfo obj)
    {
        throw new NotImplementedException();
    }
}

删除欺骗的代码:

IEnumerable<MessageInfo> new_texts = text_messages.Distinct(new SMSDupeRemover());

问题是Equals,从不调用GetHashCode。任何人都知道为什么?

4 个答案:

答案 0 :(得分:12)

因为Distinct是懒惰的。尝试在最后添加ToList()

更长的答案。 Linq操作实际上是声明性操作。它们定义查询,但它们不会告诉它执行它。 IEnumerable<T>不包含数据,只包含查询定义。你构建了查询,好吧,如何获取数据?

  • foreach IEnumerable。由于foreach是必需的,因此必须检索所有数据(执行查询)。
  • 致电ToList / ToDictionary。这些集合存储真实数据,因此为了填充它们,系统必须执行查询。

答案 1 :(得分:2)

对LINQ进行了延迟评估,因此在您致电GetEnumerator甚至可能MoveNext之前不会执行。

尝试在该查询的末尾添加.ToList(),它应立即执行。

答案 2 :(得分:2)

在枚举IEnumerable之前,不会调用IEqualityComparer。

尝试

var new_texts = text_messages.Distinct(new SMSDupeRemover()).ToList();

答案 3 :(得分:1)

我愿意

List<MessageInfo> unique_msgs = 
    new List(text_messages.Distinct(new SMSDupeRemover()));

立即呈现新列表。除非你真的需要枚举器,否则要节省内存。