4 回答

TA貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超5個(gè)贊
這是 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 的對(duì)應(yīng)舊項(xiàng)目的新項(xiàng)目。如果您還想包含沒(méi)有相應(yīng)舊項(xiàng)目的新項(xiàng)目,請(qǐng)使用左外連接:
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();
在這兩種情況下,連接運(yùn)算符都用于快速關(guān)聯(lián)具有相同 ItemID 的項(xiàng)目。然后您可以比較 QuantitySold 或任何其他屬性。

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超13個(gè)贊
即使根本沒(méi)有匹配項(xiàng),此代碼也將在不到一秒的時(shí)間內(nèi)運(yùn)行(如果一切都匹配,也將在不到一秒的時(shí)間內(nèi)運(yùn)行)。
它將返回兩個(gè)列表中存在的所有項(xiàng)目(即相同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意味著只有一個(gè)項(xiàng)目將被退回 - 如果你想要舊的和新的,而不是使用:
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貢獻(xiàn)1765條經(jīng)驗(yàn) 獲得超5個(gè)贊
從大 O 復(fù)雜性的角度來(lái)看,僅比較嵌套 for 循環(huán)中的列表將屬于O(n*m)類,其中n是數(shù)據(jù)庫(kù)中列表的大小,而m是列表的大小從 API 獲取。
為了提高性能,您可以做的是對(duì)兩個(gè)列表進(jìn)行排序,這將花費(fèi)O(n log (n) + m log (m)),然后您可以在O(n + m)中找到新項(xiàng)目。因此,您的算法的整體復(fù)雜性將屬于O(n log (n) + m log (m))類。
這是一個(gè)關(guān)于所花費(fèi)時(shí)間的想法,將二次解與超線性解進(jìn)行比較。

TA貢獻(xiàn)1807條經(jīng)驗(yàn) 獲得超9個(gè)贊
您可以考慮使用帶有自定義編寫(xiě)的 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 關(guān)注
- 180 瀏覽
添加回答
舉報(bào)