2014-09-01 51 views
0

我有,我有嵌套表像下的GroupBy對內部列表屬性

List = Stylist 
Inner List = Listerine 
Inner List Property = GroupByProperty 

現在我想所有Stylist項目,使我得到的結果中,我都記錄分組名單通過GroupByProperty

,這樣我可以得到所有的記錄進行排序由GroupByProperty

我試着像下面

Sytlist.SelectMany(x => x.Listerine).GroupBy(c => c.GroupByProperty == 3).ToList(); 
+2

*我試過像下面的**但是** ...? – 2014-09-01 07:56:50

回答

1

或..如果你只是想選擇使用WHERE和ORDERBY

Sytlist.SelectMany(x => x.Listerine).Where(c => c.GroupByProperty == 3).Orderby(c => c.GroupByProperty).ToList(); 

或者,也許你只是想刪除錯字造型師ISO Sytlist

Sytlist.SelectMany(x => x.Listerine).GroupBy(c => c.GroupByProperty == 3).ToList(); 

因此,沒有進行分組:

Stylist.SelectMany(x => x.Listerine).OrderBy(c => c.GroupByProperty).ToList(); 

也許你還想選擇SelectMany中的groupbyproperty

0

.GroupBy(c => c.GroupByProperty == 3)會產生2組。一個GroupByProperty等於3,另一個GroupByProperty不等於3.您只需添加您正在分組的屬性。

Sytlist.SelectMany(x => x.Listerine).GroupBy(c => c.GroupByProperty).ToList(); 

如果c.GroupByProperty == 3意味着是一個過濾器,那麼你應該使用Where

Sytlist.SelectMany(x => x.Listerine).Where(c => c.GroupByProperty == 3).GroupBy(c => c.GroupByProperty).ToList(); 

儘管在這種情況下,就不會有對的GroupBy子句中的意義。

0

您的GroupBy聲明是錯誤的。您將得到一個按truefalse值分組的列表,因爲語句c => c.GroupByProperty == 3將評估爲布爾值。

相反,你可能需要使用:

var result = Sytlist.SelectMany(x => x.Listerine).GroupBy(c => c.GroupByProperty); 

以上將返回IGrouping對象的集合,而不是一個平面列表。您可以通過類似的方式列舉其訪問的每個組:

foreach (var group in result) { 
    var key = group.Key; // this is a single value of the `GroupByProperty` type. 
    foreach (var obj in group) { 
     // cycle trough all items which are grouped by the current `key` item 
    } 
} 

基本上,GroupBy結果就像一張地圖,其中關鍵是GroupByProperty的任何一個值,該值是所有匹配的集合項目。在沒有匹配的情況下,您不會收到結果中的組。


如果你只需要通過GroupByProperty排序的平面列表,那麼整個GroupBy方法是無關緊要的。你可以簡單地使用:

Sytlist.SelectMany(x => x.Listerine).OrderBy(c => GroupByProperty) 

Sytlist.SelectMany(x => x.Listerine).OrderBy(c => GroupByProperty, comparer) 

其中comparerIComparer<T>實現,並且TGroupByProperty的類型。如果T本身不是可比類型,或者您需要自定義比較邏輯,則需要比較器。