4 回答

TA貢獻1856條經驗 獲得超5個贊
這是 LINQ Join的完美候選人:
var differentQuantityItems =
(from newItem in newList
join oldItem in oldList on newItem.ItemID equals oldItem.ItemID
where newItem.QuantitySold != oldItem.QuantitySold
select newItem).ToList();
這將返回所有具有不同 QuantitySold 的對應舊項目的新項目。如果您還想包含沒有相應舊項目的新項目,請使用左外連接:
var differentQuantityItems =
(from newItem in newList
join oldItem in oldList on newItem.ItemID equals oldItem.ItemID into oldItems
from oldItem in oldItems.DefaultIfEmpty()
where oldItem == null || newItem.QuantitySold != oldItem.QuantitySold
select newItem).ToList();
在這兩種情況下,連接運算符都用于快速關聯具有相同 ItemID 的項目。然后您可以比較 QuantitySold 或任何其他屬性。

TA貢獻1836條經驗 獲得超13個贊
即使根本沒有匹配項,此代碼也將在不到一秒的時間內運行(如果一切都匹配,也將在不到一秒的時間內運行)。
它將返回兩個列表中存在的所有項目(即相同ItemID)但具有不同的QuantitySold.
using System;
using System.Collections.Generic;
using System.Linq;
namespace ConsoleApp5
{
class Program
{
public class Items
{
public string ItemID { get; set; }
public int QuantitySold { get; set; }
}
static void Main(string[] args)
{
// Sample data
var oldList = new List<Items>();
oldList.AddRange(Enumerable.Range(0, 20000).Select(z => new Items() { ItemID = z.ToString(), QuantitySold = 4 }));
var newList = new List<Items>();
newList.AddRange(Enumerable.Range(0, 20000).Select(z => new Items() { ItemID = z.ToString(), QuantitySold = 5 }));
var results = oldList.Join(newList,
left => left.ItemID,
right => right.ItemID,
(left, right) => new { left, right })
.Where(z => z.left.QuantitySold != z.right.QuantitySold).Select(z => z.left);
Console.WriteLine(results.Count());
Console.ReadLine();
}
}
}
的使用z.left意味著只有一個項目將被退回 - 如果你想要舊的和新的,而不是使用:
var results = oldList.Join(newList,
left => left.ItemID,
right => right.ItemID,
(left, right) => new { left, right })
.Where(z => z.left.QuantitySold != z.right.QuantitySold)
.Select(z => new[] { z.left, z.right })
.SelectMany(z => z);

TA貢獻1807條經驗 獲得超9個贊
您可以考慮使用帶有自定義編寫的 except 子句,IEqualityComparer如下所示
var oldList = new List<Item>(); // oldList
var newList = new List<Item>(); // new list
var distinctList = newList.Except(oldList,new ItemEqualityComparer()).ToList();
class ItemEqualityComparer : IEqualityComparer<Item>
{
public bool Equals(Item i1, Item i2)
{
if (i1.ItemID == i2.ItemID && i1.QuantitySold != i2.QuantitySold)
return false;
return true;
}
public int GetHashCode(Item item)
{
return item.ItemID.GetHashCode();
}
}
public class Item
{
public string ItemID { get; set; }
public int QuantitySold { get; set; }
}
- 4 回答
- 0 關注
- 193 瀏覽
添加回答
舉報