簡體   English   中英

使用Linq比較兩個通用列表

[英]Compare two generic lists using Linq

我正在嘗試使用以下查詢比較兩個通用列表,只想插入修改后的值

所以我寫了以下內容

public ActionResult GetModifiedRecords(IEnumerable<SalesOrder> oldSalesOrderList, List<SalesOrder> newSalesOrderList)
{
    var result = (from oldSalesOrder in oldSalesOrderList
                  from newSalesOrder in newSalesOrderList
                  where
                  (oldSalesOrder.Value != newSalesOrder.Value)
                  select oldSalesOrder).Distinct();
    IEnumerable<SalesOrder> modifiedSalesList = new List<SalesOrder>(result);
    return modifiedSalesOrder;           
}

但這似乎不起作用

注意:您的Linq查詢的返回類型將是IEnumerable您不需要通過強制轉換再次創建它;

你嘗試過這樣的事情:

public IEnumerable<SalesOrder> GetModifiedRecords(IEnumerable<SalesOrder> oldSalesOrderList, List<SalesOrder> newSalesOrderList)
{
    return oldSalesOrderList.Where((x,i)=>newSalesOrderList[i].Value !=x.Value);  
}

上面的代碼只有在兩個列表具有相同的順序時才有效,如果沒有,你可以嘗試這樣的事情(假設OrderId將是一個唯一的字段):

return oldSalesOrderList.Where(x =>
       newSalesOrderList.Any(y => y.OrderId == x.OrderId && Y.Value !=x.Value));  

您可以像這樣獲取修改后的記錄:

    var modifiedRecords = newSalesOrderList.Where(a => oldSalesOrderList.All(b => b.Value != a.Value));

我真的不明白你在做什么。 但根據你的問題。 應該工作。

您可以從其他答案中獲得有關如何執行此操作的解決方案,但請讓我解釋一下您的原始查詢無效的原因。 想象一下,你用這兩個列表調用你的方法:

var list1 = new List<SalesOrder> 
    { new SalesOrder { Value = 1 }, new SalesOrder { Value = 2 } };
var list2 = new List < SalesOrder > 
    { new SalesOrder { Value = 1 }, new SalesOrder { Value = 3 } };
var res = GetModifiedRecords(list1, list2);

您的查詢將從list1獲取第一項並將其與list2的第一項進行比較,它會注意到它們是相同的,因此它不會選擇它。 然后它會將list1中的第一項與list2中的第二項進行比較,因為它們不相等,所以即使你不期望這樣,它也會從list1選擇第一項。 然后它將對list1的第二項執行相同的操作。 所以最終的結果是,即使你只期望差異,它也會從list1返回兩個項目。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM