C# 在C.NET MVC中实现IEqualityComparer

C# 在C.NET MVC中实现IEqualityComparer,c#,asp.net,asp.net-mvc,c#-4.0,asp.net-mvc-5,C#,Asp.net,Asp.net Mvc,C# 4.0,Asp.net Mvc 5,我实现了一个自定义比较器,如下所示: public class CustomComparer : IEqualityComparer<StoredEmails> { public static readonly IEqualityComparer<StoredEmails> Instance = new CustomComparer(); public bool Equals(StoredEmails x, StoredEmails y) {

我实现了一个自定义比较器,如下所示:

public class CustomComparer : IEqualityComparer<StoredEmails>
{
    public static readonly IEqualityComparer<StoredEmails> Instance = new CustomComparer();

    public bool Equals(StoredEmails x, StoredEmails y)
    {
        return x.Email == y.Email;
    }

    public int GetHashCode(StoredEmails x)
    {
        return x.Email.GetHashCode();
    }
}
其中,我有两个相同类型的列表旧的和新的项目列表,其中包含以下数据:

- ItemID
- QuantitySold
使用示例和预期结果:

var oldItems= new List<Items>(); // suppose it has 5000 items inside...

var newItems = new List<Items>(); // suppose it has 15000 items...

var thirdList = newItems .Except(oldItems, CustomComparer.Instance).ToList();
其中,要添加到第三个列表中的项目的标准如下:

public class CustomComparer : IEqualityComparer<StoredEmails>
{
    public static readonly IEqualityComparer<StoredEmails> Instance = new CustomComparer();

    public bool Equals(StoredEmails x, StoredEmails y)
    {
        return x.Email == y.Email;
    }

    public int GetHashCode(StoredEmails x)
    {
        return x.Email.GetHashCode();
    }
}
如果newList中的ItemID在oldList中不存在 如果两个ItemID都存在于两个列表中,但它们的QuantitySeld属性不相等。。。 我可以使用一个IEqualityComparer来实现这一点吗?有人能帮我吗

@Codingyosi,像这样的事情会不会:

public static readonly IEqualityComparer<Items> Instance = new ItemsComparer();

public bool Equals(Items x, Items y)
{
    if (x.ItemId != y.ItemId || x.QuantitySoldTotal != y.QuantitySoldTotal)
        return true;
    return false;
}

public int GetHashCode(Items x)
{
    return x.ItemId.GetHashCode();
}

我编写了一个扩展方法,可以为您实现所需的行为

如果新项目不在旧项目列表中,它将被添加到结果列表中。如果该项已修改,它也将添加到结果列表中

代码:

用法:

var oldItems = new List<Items>(); // suppose it has 5000 items...
var newItems = new List<Items>(); // suppose it has 15000 items...

var thirdList = newItems.GetNewOrModifiedItems(
    oldItems,
    x => x.ItemId,
    CustomComparer.Instance);

第二种情况下有多个相等条件有什么问题。@CodingYoshi hashcode部分呢?一个简单的LINQ查询不就可以了吗?比如:var thirdList=newItems.Wherex=>!oldItems.Containsx.ToList?如果一个简单的包含条件还不够,您可以使用Any函数。@TeodorKurtev很好,但它不符合quantiy属性不相等的条件:D@CodingYoshi我更新了我的问题,这是正确的方法吗?上面说没有CustomComparer.Instance?我只是使用了您在初始问题中使用的CustomComparer类进行演示。您必须编写一个实现IEqualityComparer的类并将其传入。它可以是单身或新的,这取决于你,但这只是一个例子。
public static class CollectionExtensions
{
    public static IList<T> GetNewOrModifiedItems<T, TKey>(
        this IList<T> newItems,
        IList<T> oldItems,
        Func<T, TKey> getKey,
        IEqualityComparer<T> comparer)
    {
        oldItems = oldItems ?? new List<T>();
        newItems = newItems ?? new List<T>();

        var oldItemsDictionary = oldItems.ToDictionary(getKey);
        var results = new List<T>();

        foreach (var item in newItems)
        {
            if (!oldItemsDictionary.ContainsKey(getKey(item)) ||
                !comparer.Equals(item, oldItemsDictionary[getKey(item)]))
            {
                results.Add(item);
            }
        }

        return results;
    }
}
var oldItems = new List<Items>(); // suppose it has 5000 items...
var newItems = new List<Items>(); // suppose it has 15000 items...

var thirdList = newItems.GetNewOrModifiedItems(
    oldItems,
    x => x.ItemId,
    CustomComparer.Instance);