Выбор дерева из CSV с помощью LinQ - PullRequest
1 голос
/ 24 октября 2009

У меня есть CSV с 35K строк, среди прочего, со следующими столбцами: articleID, description, class1, class2, class 3. столбцы класса представляют категории, к которым относятся продукты. class1 является основной категорией, class2 является подкатегорией class1, а class3 является подкатегорией class2.
Теперь я хочу извлечь категории в древовидной структуре, но я немного потерян.

Единственное, что я могу придумать, это следующий запрос linq, чтобы получить отдельный список. (Я не эксперт ни в linq, ни в c # /. Net в общем ...
Функция ParseStream возвращает список строк с массивом значений столбцов. i [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();

Это просто дает мне отдельный список всех путей категорий ...
Какой тип данных лучший для хранения хиархического списка? и как мне выбрать это с linq?

1 Ответ

1 голос
/ 24 октября 2009

Это можно сделать с помощью LINQ, но я не смог найти пути с хорошей производительностью.

Простой способ сделать это основан на Словаре и HashSet :

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);
}

Результатом являются иерархические данные, где первый уровень - это class1, второй - это 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);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...