2011-06-13 123 views
2

我想篩選我的主題所擁有的對象。我需要使用LINQ的幫助

我有很多話題:藝術,經濟,商業,政治。每個主題都是對象中的一個屬性,我嘗試從這些對象的列表中進行分類。

這裏是我的對象的一部分:我創造了許多這些對象的餵養他們的性質使用不同的值,並把它們放在一個列表

public class AllQuestionsPresented 
{ 
    public string Name{ get; set; } 
    public string ThreadName { get; set; } 
    public string Topic { get; set; } 
    public string Subtopic { get; set; } 
    public int Views { get; set; } 
    public int Replies { get; set; } 
    public int PageNumber { get; set; } 
    public DateTime Time { get; set; } 
    // snip 

List<AllQuestionsPresented> forumData; 

現在我想將它們組所有到linq由他們的主題..

var groupedByPages = 
    from n in forumData 
    group n by forumData 
    select ..... 

基本上我不知道如何繼續因爲我不是用來對付LINQ ..我想要得到的是一些字典..

Dictionary<string,AllQuestionsPresented> dictionary.. 

如果我不使用LINQ,並添加到字典中每一個主題,它將把幾個「AllQuestionsPresented」對象與同一主題..這將引發exception..so我必須使用組by..but不知道如何實現這一操作

回答

0

你可以撥打ToDictionary。該參數是選擇鍵和另一選擇值的函數:

var groupedByPages = 
    from n in forumData 
    group n by n.Topic; 

IDictionary<string, IEnumerable<AllQuestionsPresented>> dictionary = 
    groupedByPages.ToDictionary(x => x.Key, x => x.AsEnumerable()); 

但是如果你從IDictionary接口需要的是索引操作,很容易,只需使用一個ILookup

ILookup<string, AllQuestionsPresented> groupedByPages = forumData.ToLookup(x => x.Topic); 
0
var groupedByPages = 
    from n in forumData 
    group n by forumData.Topic 
    select n; 
4

您可以使用ToLookup,它會給你值集合的鍵/列表。您的密鑰將爲Topic,您將獲得每個密鑰的AllQuestionsPresented列表。

var lookup = forumData.ToLookup(f => f.Topic); 

Reference on ToLookup

+0

我如何將這一切轉移到字典? ToDictionary..takes arguments ..但我將它作爲參數給出的什麼 – Matrix001 2011-06-13 15:47:06

+0

字典可能不是適合使用的集合。一個字典有一個鍵和一個**單**值,而一個'ILookup'有一個具有**列表值**的鍵。在你的場景中,你有一個**線程列表,關閉了他們的主題。 – wsanville 2011-06-13 15:50:29

+0

字典的值當然可以是'List ' – 2011-06-13 15:53:32

1
var groupedByTopics = 
from n in forumData 
group n by forumData.Topic into g 
select new { Topic = forumData.Topic, Questions = g } 

您可能還需要保持這種以供參考的:-)

http://msdn.microsoft.com/en-us/vcsharp/aa336746

+0

我確實有這個作爲參考:X – Matrix001 2011-06-13 15:47:34

+0

+1爲鏈接 – 2011-06-13 15:48:07

1

的分組結果返回爲IEnumerable<IGrouping<TKey, T>>,而你的情況將是IEnumerable<IGrouping<string, AllQuestionsPresented>>

下面的代碼顯示瞭如何訪問分組中的數據。

var groupedByTopic = from question in forumData 
         group question by question.Topic; 

    foreach (var group in groupedByTopic) 
    { 
    Console.WriteLine(group.Key); 
    foreach (var question in group) 
    { 
     Console.WriteLine("\t" + question.Name); 
    } 
    } 

要創建字典從上面你可以做以下

var groupingDictionary = groupedByTopic.ToDictionary(q=>q.Key, q=>q.ToList()); 

,這將給你一個Dictionary<string, List<AllQuestionsPresented>>

如果你去查找路線,這是很好的證明@wsanville ,那麼你可以用同樣的方式得到字典

var lookup = forumData.ToLookup(q => q.Topic); 
    var groupingDictionary = lookup.ToDictionary(q => q.Key, q => q.ToList()); 
+0

哇..如果我只知道我能做到這一點! – Matrix001 2011-06-13 16:20:41

+0

ToList到底是不是正確,因爲我得到一個錯誤.. :( – Matrix001 2011-06-13 16:47:35

+0

@ Matrix001,你會得到什麼錯誤?我剛剛測試了代碼,它的工作原理,你得到一個編譯錯誤或運行時錯誤? – 2011-06-13 16:50:40