我正在尝试从包含通用对象的列表中删除重复的条目。
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。任何人都知道为什么?
答案 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()));
立即呈现新列表。除非你真的需要枚举器,否则要节省内存。