简单的IEqualityComparer<T>问题

8

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

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个回答

12

因为 Distinct 是延迟执行的。请在结尾处添加 ToList()

更详细的解释。Linq 操作实际上是声明式操作。它们定义查询,但不告诉如何执行它。 IEnumerable<T> 不包含数据,只有查询定义。你已经构造了查询,好的,如何获取数据?

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

太好了,我现在明白了。这让我疯狂了...谢谢! - duck

2

LINQ是延迟执行的,这意味着直到调用GetEnumerator甚至MoveNext时才会执行。

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


2
IEqualityComparer直到IEnumerable被枚举时才被调用。
尝试。
var new_texts = text_messages.Distinct(new SMSDupeRemover()).ToList();

哦,我不知道。谢谢! - duck

1

我会做

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

为了立即呈现新列表。除非您真的需要枚举器来节省内存。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接