繁体   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