我有两个大型项目列表,它们的类看起来像这样(两个列表都属于同一类型):
public class Items
{
public string ItemID { get; set; }
public int QuantitySold { get; set; }
}
var oldList = new List<Items>(); // oldList
var newList = new List<Items>(); // new list
旧列表包含来自数据库的项目,新列表表示从 API 获取的项目;
两个列表都可能非常大,每个列表包含 10000 多个项目(总共 20000 个)
我需要将 newList 中的项目与“oldList”中的项目进行比较,并查看哪些项目具有相同的 itemID 值,具有不同的“QuantitySold”值,而那些具有不同“QuantitySold”值的项目应存储在名为“不同数量的项目”。
我可以简单地做双 foreach 列表并比较值,但由于两个列表都很大,双 foreach 循环的性能很糟糕,我做不到......
有人可以帮我解决这个问题吗?
@YamamotoTetsua 我已经在使用 IEqualityComparer 来获得所需的结果,但是它并没有给出我期望的结果。这就是为什么......我有一个看起来像这样的第一个 IEqualityComparer:
public class MissingItemComparer : IEqualityComparer<SearchedUserItems>
{
public static readonly IEqualityComparer<SearchedUserItems> Instance = new MissingItemComparer();
public bool Equals(SearchedUserItems x, SearchedUserItems y)
{
return x.ItemID == y.ItemID;
}
public int GetHashCode(SearchedUserItems x)
{
return x.ItemID.GetHashCode();
}
}
这个 IEqualityComparer 的使用基本上给了我来自 newList 的项目,这些项目在我的数据库中不存在,如下所示:
var missingItems= newItems.Except(competitor.SearchedUserItems.ToList(), MissingItemComparer.Instance).ToList();
现在在此列表中,我将列出 API 中的新项目列表,并且不存在于我的数据库中...
第二个 IEqualityComparer 基于旧列表和新列表中不同的 QuantitySold:
public class ItemsComparer : IEqualityComparer<SearchedUserItems>
{
public static readonly IEqualityComparer<SearchedUserItems> Instance = new ItemsComparer();
public bool Equals(SearchedUserItems x, SearchedUserItems y)
{
return (x.QuantitySold == y.QuantitySold);
}
public int GetHashCode(SearchedUserItems x)
{
return x.ItemID.GetHashCode();
}
}
使用示例:
var differentQuantityItems = newItems.Except(competitor.SearchedUserItems.ToList(), ItemsComparer.Instance).ToList();
他们确实从我的 oldList 中丢失了......但是第二个 IEQualityComparer 也会将这些项目作为 differentQuantity 项目返回,它们确实是,但它们不存在于 oldList 中。所以它们不应该包含在第二个列表中.
繁星coding
RISEBY
开心每一天1111
POPMUISE
函数式编程
随时随地看视频慕课网APP
相关分类