C# 简单的IEqualityComparer<;T>;问题

C# 简单的IEqualityComparer<;T>;问题,c#,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 E

我试图从包含泛型对象的列表中删除重复项

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();
    }
}
public class MessageInfo
{
公共日期时间日期{get;set;}
{get;set;}的公共字符串
公共字符串消息{get;set;}
}
公共类SMSDupeRemover:IEqualityComparer
{
公共bool等于(MessageInfo x,MessageInfo y)
{
抛出新的NotImplementedException();
}
public int GetHashCode(MessageInfo obj)
{
抛出新的NotImplementedException();
}
}
以及删除复制的代码:

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

问题是Equals,并且永远不会调用GetHashCode。有人知道为什么吗?

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

更长的回答。Linq操作实际上是声明性的。它们定义查询,但不告诉执行它
IEnumerable
不包含数据,只包含查询定义。您已经构建了查询,好的,如何获取数据

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

LINQ是延迟计算的,因此在调用
GetEnumerator
甚至可能调用
MoveNext
之前,LINQ不会执行


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

直到枚举IEnumerable之后,才会调用IEqualityComparer

试一试

我愿意

List<MessageInfo> unique_msgs = 
    new List(text_messages.Distinct(new SMSDupeRemover()));
List unique\u msgs=
新列表(text_messages.Distinct(新的SMSDupeRemover());

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

ooh,我不知道。非常感谢。很好,我现在明白了。我快疯了。。。非常感谢。
List<MessageInfo> unique_msgs = 
    new List(text_messages.Distinct(new SMSDupeRemover()));