2017-01-27 34 views
3
两个泛型列表

我想比较两个泛型列表使用下面的查询,只需要插入修改后的值只能比较使用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;   
} 

但这似乎不工作

+0

你的意思是不工作?你用当前代码发现了什么错误? –

+0

其获得整个记录集,而不比较 –

+0

'VAR modifiedRecords = newSalesOrderList.Except(oldSalesOrderList);' 你可以,如果你的SalesOrder类实现IComparer的,将比较相关字段/属性,如果他们匹配 – meganaut

回答

1

注意:您的Linq Query的返回类型将为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)); 
1

你可以像这样修改记录:

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

我做nt真的明白你在做什么。但基于你的问题。这应该工作。

1

你有解决方法,从其他答案,但让我解释为什么你的原始查询不起作用。想象一下,你打电话给你的方法与这些2名列表:

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这两个项目。