2009-10-24 23 views
1

我有一個帶有35K行的csv,其中包括以下柱子:articleID,description,class1,class2,class 3.
class collumns表示類別產品屬於。 class1是主要類別,class2是class1的子類別,class3是class2的子類別。
現在我想提取樹結構中的類別,但我有點迷路。使用LinQ從csv中選擇一棵樹

我唯一能想到的就是下面的linq查詢來獲得一個清晰的列表。 (我不是linq或c#/ .Net的專家,一般來說...
ParseStream函數返回一個列表,其中包含一個列表值列表,[3],[4]和[5]表示1級,2和3

List<string[]> infoList = ParseStream(infoFile); 
      List<string> categories = (from i in infoList 
             select new StringBuilder().Append(i[3]).Append(";").Append(i[4]).Append(";").Append(i[5]).ToString()) 
             .Distinct().ToList(); 

這只是給我的所有類路徑的分隔列表...
我存儲在hiarchical列表中選擇最佳數據類型?和我如何選擇此使用LINQ?

+0

重新標記。沒有C#3.5(請參閱http://stackoverflow.com/questions/247621/what-are-the-correct-version-numbers-for-c) – Vaccano 2009-11-02 23:11:33

回答

1

這可以通過LINQ做,但我找不到有良好的表現方式。

SIM卡做到這一點PLE方式是基於DictionaryHashSet

IList<string[]> infoList = ParseStream(infoFile); 
var dictionary = new Dictionary<string, Dictionary<string, HashSet<string>>>(); 
foreach (var articeInfo in infoList) 
{ 
    string class1 = articeInfo[3]; 
    string class2 = articeInfo[4]; 
    string class3 = articeInfo[5]; 

    Dictionary<string, HashSet<string>> class1Categories; 
    if (!dictionary.TryGetValue(class1, out class1Categories)) 
    { 
     class1Categories = new Dictionary<string, HashSet<string>>(); 
     dictionary[class1] = class1Categories; 
    } 

    HashSet<string> class2Categories; 
    if (!class1Categories.TryGetValue(class2, out class2Categories)) 
    { 
     class2Categories = new HashSet<string>(); 
     class1Categories[class2] = class2Categories; 
    } 

    class2Categories.Add(class3); 
} 

結果是分層次的數據,其中第一級是1類,第2個是類class2和最後一個是CLASS3。字典鍵在默認情況下是不同的,HashSet值也是如此,所以它可以避免重複值。

例如,要打印層次縮進方式的所有值:

var classes = new Dictionary<string, Dictionary<string, HashSet<string>>>(); 

foreach (var class1 in classes) 
{ 
    Console.WriteLine(class1.Key); 
    foreach (var class2 in class1.Value) 
    { 
     Console.WriteLine("\t{0}", class2.Key); 
     foreach (var class3 in class2.Value) 
     { 
      Console.WriteLine("\t\t{0}", class3); 
     } 
    } 
} 
+0

尼斯,工作的答案。 Dictionary和HashSet是存儲這個的好方法。但我想用linq在1條語句中選擇它... – NDM 2009-10-24 17:49:59