2016-05-05 73 views
1

我正在構建一個庫應用程序。我有一份書籍清單,其中一些書名重複(有幾本同一本書)。我想將列表轉換爲Dictionary>,其中字符串將是書的名稱,List將包含具有該名稱的所有Book對象。LINQ - 按名稱分組爲詞典<字符串,列表<T>>

我已經成功地走到這一步:

var result = queriedBooks 
       .GroupBy(b => b.Name) 
       .Where(g => g.Count() >= 1) 
       .ToDictionary(b => b.Key, ///); 

這是我卡住。我不知道該傳遞什麼價值。智能感應也沒有幫助,因爲沒有Value屬性可用。我想避免使用匿名對象,因爲每個Book條目都有許多我在視圖中使用的屬性。

非常感謝!

+0

非重複書籍呢?你也想包括它們嗎? –

+1

'b => b.ToList()'應該可以工作 –

+0

呃,'g.Count()> = 1'看起來*冗餘* –

回答

6

作爲替代,你可能想的只是Lookup<String, Book>代替combersome Dictionary<String, List<Book>>

LookUp<String, Book> result = queriedBooks 
    .ToLookup(book => book.Name); 

在案件Dictionary<String, List<Book>>

var result = queriedBooks 
    .GroupBy(book => book.Name) 
    .ToDictionary(chunk => chunk.Key, chunk => chunk.ToList()); 

請注意tha t .Where(g => g.Count() >= 1)冗餘;

+0

謝謝!我決定使用'ToLookup',因爲它似乎是一個更加充分的解決方案。但是我現在掙扎的是如何在視圖中渲染一個名稱爲'Name'的屬性。以前,對於一個簡單的書目清單,我使用了@ Html.DisplayNameFor(model => model.Name)',它工作。您可能知道如何在使用Lookup時訪問此屬性?嘗試了@ Html.DisplayNameFor(model => model.FirstOrDefault()',這會給我第一對,但我不知道如何訪問Book對象及其屬性。謝謝! – Dandry

+0

@Dandry:因爲'LookUp '實現'IEnumerable >'你可能需要像'@ Html.DisplayNameFor(model => model.Key)'或類似的東西;要獲得'Book'實例model = > model.FirstOrDefault()。Select(book => ...)'因爲'IGrouping '實現了IEnumerable ' –

+0

這些不知何故不起作用。 @ Html.DisplayNameFor(model => model.First()。First()。Name)'。非常感謝! – Dandry

6

您只需要使用ToList()這樣的:

.ToDictionary(b => b.Key, b => b.ToList()); 

每個組都有一個Key屬性,該屬性是關鍵。它也(組)是一個IEnumerable<Book>,代表組中的項目,這就是爲什麼ToList()工作。

+0

非常感謝!問題解決了。 – Dandry

+0

歡迎您 –

1

嘗試與ToListdistinct例如在一個表中,列可能包含許多重複的值;有時你只想列出不同的(不同的)值。

var query = queriedBooks 
      .Distinct() 
      .GroupBy(b => b.Name) 
      .ToDictionary(b => b.Key, b.ToList()); 

請不要使用它.Where(g => g.Count() >= 1)它是多餘的

相關問題