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