У меня есть два больших списка элементов, класс которых выглядит следующим образом (оба списка одного типа):
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значения имеют различное значение «Количество проданных», а те, которые имеют разное значение «Количество проданных», должны храниться в третьем списке, называемом «разные количественные показатели».
Я мог бы просто сделать двойной список 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 основан на различном КоличествоПродано из старого и нового списка:
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();
Проблема с этими двумя сравнителями равенства заключается в том, что первый из них, например, возвратит отсутствующие itemID:
123124124
123124421
512095902
И они действительно отсутствуют в моем старом списке ... Однако второй IEQualityComparer также будет возвращать эти элементы как различные элементы количества, они действительно есть, но их нет в старом списке. Поэтому их не следует включать ввторой список.