我有兩個集合,其中包含更多的專案,例如一百萬。我想比較它們以在 C# 中找出以下內容
- 如何找到 Orders1 和 Orders2 之間的匹配項
- 如何找到 Orders2 中的 Orders1
- 如何找到 Orders1 中的 Orders2
- 如何找到不在 Orders2 中的 Orders1
- 如何找到不在 Orders1 中的 Orders2
public class Order
{
public int OrderID { get; set; }
public string OrderDate { get; set; }
public string StoreID { get; set; }
public float TotalPrice { get; set; }
}
static void Main(string[] args)
{
List<Order> Orders1 = new List<Order>();
Orders1.Add(new Order { OrderID = 1, StoreID = "A01", TotalPrice = 12.1F });
Orders1.Add(new Order { OrderID = 2, StoreID = "A02", TotalPrice = 12.2F });
Orders1.Add(new Order { OrderID = 3, StoreID = "A03", TotalPrice = 12.3F });
Orders1.Add(new Order { OrderID = 4, StoreID = "A04", TotalPrice = 12.4F });
Orders1.Add(new Order { OrderID = 1, StoreID = "A01", TotalPrice = 12.1F });
Orders1.Add(new Order { OrderID = 5, StoreID = "A05", TotalPrice = 12.5F });
List<Order> Orders2 = new List<Order>();
Orders2.Add(new Order { OrderID = 1, StoreID = "A01", TotalPrice = 12.1F });
Orders2.Add(new Order { OrderID = 2, StoreID = "A02", TotalPrice = 12.2F });
Orders2.Add(new Order { OrderID = 2, StoreID = "A03", TotalPrice = 12.2F });
Orders2.Add(new Order { OrderID = 1, StoreID = "A01", TotalPrice = 12.1F });
Orders2.Add(new Order { OrderID = 5, StoreID = "A05", TotalPrice = 12.5F });
Orders2.Add(new Order { OrderID = 6, StoreID = "A06", TotalPrice = 12.6F });
Orders2.Add(new Order { OrderID = 7, StoreID = "A07", TotalPrice = 12.7F });
}
uj5u.com熱心網友回復:
var result = from x in Orders1
join y in Orders2 on x.OrderID equals y.OrderID
select x; //1
Orders1.Where(x=>Orders2.Any(y=>y.OrderID == x.OrderID )); //2
Orders2.Where(x=>Orders1.Any(y=>y.OrderID == x.OrderID )); //3
Orders1.Where(p => Orders2.All(p2 => p2.OrderID != p.OrderID)); //4
Orders2.Where(p => Orders1.All(p2 => p2.OrderID != p.OrderID)); //5
uj5u.com熱心網友回復:
性能重要嗎?請記住,您可以在O(mn)中檢查所有這些,其中m和n分別是 Orders1 和 Orders2 的大小。
- 如果性能不是那么重要,那么采用簡單的 2 周期方法:
- 有 5 個串列(每個案例一個),并相應地對您的訂單進行分類。
- 如果性能是一個重要因素,那么:
了解如何實作IComparable,因為您需要比較三個東西:OrderID、StoreID 和 TotalPrice。您需要在Order類中實作它。谷歌是你的朋友。這是一個例子:https ://www.geeksforgeeks.org/c-sharp-program-to-implement-icomparable-interface/#:~:text=C# provides an IComparable interface,on which basis to sort。
然后您需要創建自己的 List 類,并使用二進制搜索插入。然后,當您滾動瀏覽串列時,您的搜索速度會更快。
在這兩種情況下,您都應該(如果您有足夠的記憶體,這不是必須的)按某些標準對兩個串列進行排序(可能是OrderID,IComparable 可能會有所幫助),并且當您對訂單進行分類時,洗掉它們兩個訂單串列,所以您不要'最終不會有 2 個百萬串列 5 個分類訂單串列。再次,學習記憶體管理。
根據我的個人經驗,不要使用 lambda 運算式。如果您聲稱每個串列中有超過一百萬個條目,您可能會遇到記憶體問題。
我個人的建議:學習實作 IComparable 并創建自己的插入。我認為這個練習的教訓是學習如何在擁有數百萬行資料的情況下解決這類問題。
uj5u.com熱心網友回復:
看看C# join 子句。包含有關如何實施的完整檔案
- 內部聯接
- 群組加入
- 左外連接
然后操縱您的查詢Join
以提取資料。
var intersecting = from o1 in Orders1
join o2 in Orders2 on o1.OrderID equals o2.OrderID
select o1;
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/517207.html
標籤:C#。网c#-4.0