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 关注
- 206 浏览
添加回答
举报

