C# 使用Linq比较两个通用列表

C# 使用Linq比较两个通用列表,c#,linq,generics,C#,Linq,Generics,我试图使用下面的查询比较两个通用列表,只想插入修改后的值 所以我写了以下内容 public ActionResult GetModifiedRecords(IEnumerable<SalesOrder> oldSalesOrderList, List<SalesOrder> newSalesOrderList) { var result = (from oldSalesOrder in oldSalesOrderList fro

我试图使用下面的查询比较两个通用列表,只想插入修改后的值

所以我写了以下内容

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;           
}
公共操作结果GetModifiedRecords(IEnumerable oldSalesOrderList、List newSalesOrderList) { var result=(来自oldSalesOrder列表中的oldSalesOrder 从newSalesOrder列表中的newSalesOrder 哪里 (oldSalesOrder.Value!=newSalesOrder.Value) 选择oldSalesOrder).Distinct(); IEnumerable modifiedSalesList=新列表(结果); 返回修改后的订单; }
但这似乎不起作用

注意:Linq查询的返回类型将是
IEnumerable
您不需要通过强制转换再次创建它

你有没有试过这样的方法:

public IEnumerable<SalesOrder> GetModifiedRecords(IEnumerable<SalesOrder> oldSalesOrderList, List<SalesOrder> newSalesOrderList)
{
    return oldSalesOrderList.Where((x,i)=>newSalesOrderList[i].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);
var list1=新列表
{new SalesOrder{Value=1},new SalesOrder{Value=2};
var list2=新列表<销售订单>
{new SalesOrder{Value=1},new SalesOrder{Value=3};
var res=GetModifiedRecords(列表1、列表2);

您的查询将从
list1
中获取第一项,并将其与
list2
的第一项进行比较,它会注意到它们是相同的,因此不会选择它。然后,它会将
list1
中的第一个项目与
list2
中的第二个项目进行比较,因为它们不相等,所以它会从
list1
中选择第一个项目,即使您没有预料到这一点。然后它将对
列表1
中的第二项执行相同的操作。因此,最终结果是,它将从
list1
返回两个项目,即使您只希望得到差异。

您所说的不工作是什么意思?您发现当前代码有什么问题?它获取整个记录集时没有比较
var modifiedRecords=newsaleorderlist.Except(oldSalesOrderList)如果SalesOrder类实现了一个IComparer,该IComparer将比较相关字段/属性,并返回它们是否匹配,则可以使用此方法。我只想通过
oldSalesOrder.Value!=newSalesOrder.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);