5SK*_*SK5 4 c# iequalitycomparer except
我有两个相同类型的列表.
一个列表是从文件加载并转换为正确类型的反序列化json对象.
另一个是由相同类型的对象创建的列表.
当我这样做时,List2.Except(List1)我希望看到一切都List2没有List1
在这种情况下,List2将拥有所有的东西,List1而不是更多,所以我希望看到Enumerable<T>大小为0的结果,但我只是看到整个,List2好像比较从未发生过.
IEnumerable<Review> newReviews = reviews.Except(savedRvReviews, new ReviewComparer());
Run Code Online (Sandbox Code Playgroud)
我也试过使用EqualityComparer下面的代码:
public class ReviewComparer : IEqualityComparer<Review>
{
public bool Equals(Review x, Review y)
{
return x.ReviewID == y.ReviewID;
}
public int GetHashCode(Review rv)
{
return EqualityComparer<Review>.Default.GetHashCode(rv);
}
}
Run Code Online (Sandbox Code Playgroud)
并得到了相同的结果.
通过LINQ查询迭代List2和搜索List1,我得到0的预期结果.
foreach (Review s in reviews)
{
var m = from k in savedRvReviews
where k.ReviewID == s.ReviewID
select k;
if (m.Count() == 0)
{
// Do something with new reviews
}
}
Run Code Online (Sandbox Code Playgroud)
代码Review类型:
public class Review : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
[Browsable(false)]
public string ReviewID { get; set; }
public string ProductID { get; set; }
public DateTime DateSubmitted { get; set; }
public string ReviewTitle { get; set; }
[Browsable(false)]
public string ReviewDescription { get; set; }
public int ReviewMark { get; set; }
[Browsable(false)]
public bool Approved { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
您编写了一个比较器,当两个评论的ID相等时,两个评论相同,但您没有修改哈希码.两个相同的评论应该生成相同的哈希码,而不是.
实现它的最简单方法是为相同的评论返回相同的哈希码.例如,通过使用唯一使两个评论相等的哈希码,ID:
public class ReviewComparer : IEqualityComparer<Review>
{
public bool Equals(Review x, Review y)
{
return x.ReviewID == y.ReviewID;
}
public int GetHashCode(Review rv)
{
return rv.ReviewID.GetHashCode();
}
}
Run Code Online (Sandbox Code Playgroud)