2016-05-25 119 views
0

我有两个列表:订单和项目,我需要通过它们的名称进行比较,然后查看订单列表是否将bool设置为false,并且如果它满足条件,则它复制其字符串消息,然后添加新的名单,我只是不该死的想法,甚至如何比较列表,所以任何帮助将不胜感激 功能:比较linq中的两个列表

private static void FailedItemsList(List<Item> failed, List<Order> orders, List<Item> items) 
{ 
    foreach(var order in orders) 
    { 
     foreach(var item in items) 
     { 
      if(order.Equals(item)) 
      { 
       if(order.Fulfilled == false) 
       { 
        item.FailMessage = order.FailMessage; 
        failed.Add(item); 
       } 
      } 
     } 
    } 
} 
+0

你说的比较是什么意思?需要输出什么? – Aimnox

+0

我忘了说Equals比较order.Name到item.Name,所以在linq我需要它会比较我的名字,如果匹配,然后检查是否order.Fulfilled == false,如果它是那么项目应该复制FailMessage和将这个项目添加到新列表中,我知道它是一个很大的混乱,但多数民众赞成在被问到的事情: – Donatas

+0

你确定你的代码工作,秩序是一个不同的类,但你使用order.Equals(项目)? –

回答

0
var v = from x in orders 
     where x.Fulfilled == false 
     join item in items on order.Name equals item.Name 
     select x.FailMessage; 

foreach (int i in v) 
    failed.Add(i); 
2

一般来说,我会回到这个“故障列表”,从方法,而不是传递给它。你可以使用LINQ来简化这一任务:

static List<Item> GetFailedItems(List<Order> orders, List<Item> items) 
{ 
    var failed = from order in orders 
       where !order.Fulfilled 
       join item in items on order.Name equals item.Name 
       select new { order, item}; 

    List<Item> failedItems = new List<Item>(); 
    foreach (var x in failed) 
    { 
     x.item.FailMessage = x.order.FailMessage; 
     failedItems.Add(x.item); 
    } 

    return failedItems; 
} 

由于ItemOrder属于不同类别我已经删除了Equals检查,并根据需要用加入对Name属性取代了它。由于LINQ不应该引起副作用,我没有修改查询中的Item.FailMessage属性,而是修改了foreach -loop。由于LINQ的延期执行(查询在foreach处执行),这并不是那么低效。

0

流利的语法解决方案:

List<Item> FailedItem = new List<Item>(); 

FailedItem.AddRange(
orders.Join(items, o => o.Name, i => i.Name, (o, i) => new {o, i}) 
     .Where(x => !x.o.Fulfilled) 
     .ToList() 
     .ForEach(x => x.i.FailMessage = x.o.FailMessage) 
     .Select(x => x.i)) ; 
+1

看起来好像你已经使用了'ForEach'扩展方法,不存在于框架 –

+0

我不好意思指出了这个错误,我正在写在记事本上 –