2016-05-25 16 views
0

私は2つのリストを持っています:注文とアイテムを名前で比較し、次に注文リストにboolがfalseに設定されているかどうかを調べ、条件を満たしていれば、新しいリストへと私だけのリストを比較するためにも、どのように何らおかしくなりの考えを持っていないので、任意の助けが 機能は理解されるであろう:私は代わりの方法から、この「フェイル・リスト」を返します。一般にlinqの2つのリストを比較する

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がitem.Nameとorder.Nameを比較することを忘れてしまったので、linqではtheiの名前を比較し、一致すればorder.Fulfilled == falseをチェックし、そうであればItemはFailMessageをコピーする必要があります。その項目を新しいリストに追加すると、私は大きな混乱を知っていますが、それは私が尋ねられたものです:( – Donatas

+0

あなたのコードが動作していることを確認してください、OrderはItemとは異なるクラスですが、order.Equals(item)を使用していますか? –

答えて

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

をそれをそれに渡す。 ItemOrder iはEqualsチェックを削除し、必要に応じてName性質に参加して、それを交換した別のクラスなので

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; 
} 

:このタスクを簡素化するためにLINQを使用することができます。 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

私は間違いを指摘してくれたことに悪いことに、私はメモ帳に書いていました –

関連する問題