2012-01-13 21 views
2

この関数は、IEnumerable <の注文番号>に降順番号を設定することになっていますが、機能しません。誰がそれに間違っているのか教えてもらえますか?私の匿名メソッドがループで動作しないのはなぜですか?

private void orderNumberSetter(IEnumerable<Order> orders) 
{ 
    var i = 0;    

    Action<Order, int> setOrderNumber = (Order o, int count) => 
    { 
     o.orderNumber = i--; 
    }; 

    var orderArray = orders.ToArray(); 
    for (i = 0; i < orders.Count(); i++) 
    { 
     var order = orderArray[i]; 
     setOrderNumber(order, i); 
    }    
} 
+2

どのように動作しないか教えていただけますか? – BoltClock

+1

私の推測はラインで 'o.orderNumberは=私は - 、それは無限ループであなたを置くように'思えます。 –

答えて

9

あなたは再使用しているあなたのsetOrderNumberラムダに変更されますループ変数としてiiを - iを変更しない - それはあなたは多分次を行うには何を意味するのかは不明だ:

Action<Order, int> setOrderNumber = (Order o, int count) => 
{ 
    o.orderNumber = count; 
}; 

上記の場合は、それほど簡単にコードを作成することができますが、コードが不必要に複雑になっているようです(例:

for (i = 0; i < orderArray.Length; i++) 
{ 
    orderArray[i].orderNumber = i; 
} 
すべての配列を作成することなく

またはさらに簡単:

int orderNum = 0; 
foreach(var order in orders) 
{ 
    order.orderNumber = orderNum++; 
} 

編集:

注文番号を降順に設定するには、あなたがそこから逆方向に行く最初に注文数を決定することができます。

上記では、降順で1つのベースの注文番号が生成されます。より直感的で、おそらく保守が容易別のアプローチは、ちょうど逆の順序で列挙を歩くことです:

int orderNum = 0; 
foreach(var order in orders.Reverse()) 
{ 
    order.orderNumber = orderNum++; 
} 
+0

ありがとう、私は今無限ループを参照してください。これはその問題を解決し、最も効率的な解決策のようです。唯一のことは、降順の注文番号を設定しようとしていたことです。 – magoverflow

+0

@magoverflow:降順番号を達成するための2つのアプローチによる最新の回答 – BrokenGlass

2

は、私はあなたが無限ループに実行されている、BrokenGlassに同意します。

あなたはforeachを使用して同じことを達成できる:それはそのハードは何を教えてますが、配列を

private void orderNumberSetter(IEnumerable<Order> orders) 
{ 
    int i = orders.Count(); 
    foreach (Order order in orders.ToArray()) 
    { 
     order.orderNumber = --i; 
    }    
} 
2

iをデクリメントあなたをしようとすると、無限ループの原因となっている同じ変数iを参照し続けることを意味していないという良い賭けです。私はあなたのタイトルを編集することをお勧め

IEnumerable<Order> reversed = orders.ToArray(); //To avoid editing the original 
reversed.Reverse(); 
int orderNumber = 0; 
foreach (Order order in reversed) 
{ 
    order.orderNumber = orderNumber++; 
} 

HERESに私が信じるものの別の例は、あなたが望んでいました。あなたのタイトルはあなたの質問を記述しています。あなたはすでにC:の機能を望んでいないと確信しています。あなたの期待される結果があり、そしてどのようにあなたの現在の例では、それらを満たしていないものを含めて、あなたのコードを徹底的にポストに何をすべきかを説明するために、そのも良いです。あなたの非実際の例だけであなたが望むものを説明することはできません、それは私たちがあなたが望まないものの例を示しました。

2

を列挙しながら、私が代わりにこのコードをしようとするだろう

private void orderNumberSetter(IEnumerable<Order> orders) 
{ 
    var count = orders.Count(); 

    orders.ToList().ForEach(o => 
    { 
     o.orderNumber = count--; 
    }); 
} 
関連する問題