2010-10-16 67 views
0

假設我有兩個類Customer和Order,其中一個Customer可以有一個或多個與其關聯的訂單。如何使用linq重寫這個foreach循環?

class Customer 
{ 
    Order[] Orders; 
} 

class Order 
{ 
    int OrderId; 
} 

如果對於任何給定的客戶,我想查找所有關聯的OrderId,有沒有一種簡單的方法來使用linq?一些產生與以下各種解決方案相同的結果:

List<int> allOrderIds = new List<int>(); 
foreach (Order thisOrder in thisCustomer) 
{ 
    allOrderIds.Add(thisOrder.OrderId); 
} 

TIA。

回答

8
var allOrderIds = thisCustomer.Orders.Select(o => o.OrderId).ToList(); 
+1

其實是的,這是更好的解決方案。 +1 – RPM1984 2010-10-16 04:40:22

+0

很好,謝謝! – mikel 2010-10-16 05:15:03

1

您可以使用,許多人創建一個擴展方法:

public static void ForEach<T>(this IEnumerable<T> enumeration, Action<T> action) 
{ 
    foreach(T item in enumeration) 
    { 
     action(item); 
    } 
} 

而且使用這樣的:

thisCustomer.Orders.ForEach(c => allOrderIds.Add(o.OrderId)); 
+0

順便說一句 - @ mquander的解決方案更好,但是我建議你創建上述擴展方法來添加你的「LINQ Toolbelt」。它會派上用場。 – RPM1984 2010-10-16 04:40:52

+0

另請參閱利珀特的評論,這是否是一種好方法... http://blogs.msdn.com/b/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx – 2010-10-16 04:44:25

+0

有趣的,但我不同意他(在這種情況下)。是的 - 它的可讀性較差,我不會爲複雜的操作而做它(我主要將它用於循環測試斷言)。但是,如果你發現不可讀,最有可能你會發現所有的lambda表達式不可讀。我不明白的是爲什麼它實現了'List '而不是'IEnumerable '。 – RPM1984 2010-10-16 05:27:44

0

使用選擇方法。如果你想對它們做很多linq語句,你還應該把訂單作爲一個List。

thisCustomer.Orders.ToList().Select(o => o.OrderId).ToList(); 
+5

第一個'.ToList()'是毫無意義的。 – 2010-10-16 04:46:09