List<T>.Except(List<T>) 未按预期工作
List<T>.Except(List<T>) not working as expected
我有两个相同类型的列表。
一个列表是从文件加载并转换为正确类型的反序列化 json 对象。
另一个是由相同类型的对象创建的列表。
当我执行 List2.Except(List1)
时,我希望看到 List2
中不在 List1
中的所有内容
在这种情况下,List2
将拥有 List1
拥有的一切,仅此而已,所以我希望看到结果 Enumerable<T>
大小为 0,但我只是看到整个 List2
就像从未发生过比较一样。
IEnumerable<Review> newReviews = reviews.Except(savedRvReviews, new ReviewComparer());
我也尝试使用 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);
}
}
得到了相同的结果。
遍历 List2
并通过 LINQ 查询搜索 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
}
}
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; }
}
解决方案是将 IEquatable<Review>
接口添加到我的 Review
class 并实现 Equals
方法:
public bool Equals(Review rv)
{
return this.ReviewID == rv.ReviewID;
}
我发布的其余代码工作正常,但这是我缺少的部分。
您编写了一个比较器,当两个评论的 ID 相同时,它们是相同的,但您没有修改哈希码。两条相同的评论应该产生相同的哈希码,而你的则不会。
实现它的最简单方法是 return 对相同的评论使用相同的哈希码。例如,通过使用唯一使两条评论相等的哈希码,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();
}
}
我有两个相同类型的列表。
一个列表是从文件加载并转换为正确类型的反序列化 json 对象。
另一个是由相同类型的对象创建的列表。
当我执行 List2.Except(List1)
时,我希望看到 List2
中不在 List1
在这种情况下,List2
将拥有 List1
拥有的一切,仅此而已,所以我希望看到结果 Enumerable<T>
大小为 0,但我只是看到整个 List2
就像从未发生过比较一样。
IEnumerable<Review> newReviews = reviews.Except(savedRvReviews, new ReviewComparer());
我也尝试使用 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);
}
}
得到了相同的结果。
遍历 List2
并通过 LINQ 查询搜索 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
}
}
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; }
}
解决方案是将 IEquatable<Review>
接口添加到我的 Review
class 并实现 Equals
方法:
public bool Equals(Review rv)
{
return this.ReviewID == rv.ReviewID;
}
我发布的其余代码工作正常,但这是我缺少的部分。
您编写了一个比较器,当两个评论的 ID 相同时,它们是相同的,但您没有修改哈希码。两条相同的评论应该产生相同的哈希码,而你的则不会。
实现它的最简单方法是 return 对相同的评论使用相同的哈希码。例如,通过使用唯一使两条评论相等的哈希码,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();
}
}