编程语言
首页 > 编程语言> > c# – List.Except(List)未按预期工作

c# – List.Except(List)未按预期工作

作者:互联网

我有两个相同类型的列表.

一个列表是从文件加载并转换为正确类型的反序列化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
    }
}

审核代码类型:

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; }
}

解决方法:

您编写了一个比较器,当两个评论的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();
    }
}

标签:c,iequalitycomparer,except
来源: https://codeday.me/bug/20190527/1167100.html