2016-05-25 156 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

我不好意思指出了這個錯誤,我正在寫在記事本上 –