Использование LINQ для решения этой проблемы - PullRequest
0 голосов
/ 13 сентября 2011

Сначала я опишу структуру моей таблицы.

У меня есть таблица с 2 столбцами (ID и Root).Эта таблица преобразуется в список узлов, где простая структура узлов имеет вид:

struct Node
{
    public int id;
    public int root;
}

Мне нужно найти все записи в этом списке, где есть 3 или более равных корня.

Пример:

struct TeleDBData
{
    public int ID;
    public int? RootID;
}

private void InitList()
{
    var eqList = new List<TeleDBData>();

    TeleDBData root = new TeleDBData();
    root.ID = 1;

    TeleDBData node1 = new TeleDBData();
    node1.ID = 2;
    node1.RootID = 1;

    TeleDBData node2 = new TeleDBData();
    node2.ID = 3;
    node2.RootID = 1;

    TeleDBData node3 = new TeleDBData();
    node3.ID = 4;
    node3.RootID = 1;

    TeleDBData node4 = new TeleDBData();
    node4.ID = 5;
    node4.RootID = 2;

    eqList.Add(root);
    eqList.Add(node1);
    eqList.Add(node2);
    eqList.Add(node3);
    eqList.Add(node4);
}

После выполнения запроса он вернет node1, node2 и node3.

Как их найти с помощью LINQ?

Спасибо.

1 Ответ

4 голосов
/ 13 сентября 2011

Вам просто нужно GroupBy соответственно:

var groups = eqList.GroupBy(n => n.RootID).Where(g => g.Count() >= 3);

foreach (var g in groups) {
    Console.Out.WriteLine("There are {0} nodes which share RootId = {1}",
                          g.Count(), g.Key);
    foreach (var node in g) {
        Console.Out.WriteLine("    node id = " + node.ID);
    }
}

Посмотреть в действии .

Дополнительная информация :

В приведенном выше коде g - это IGrouping<int?, TeleDBData>, поэтому, согласно определению на странице документации, это набор TeleDBData элементов, имеющих общий ключ (то есть int? ). groups - это IEnumerable<IGrouping<int?, TeleDBData>>, все это стандартная процедура для Enumerable.GroupBy метода.

Две вещи, которые вы хотели бы сделать с IGrouping<,>, - это получить доступ к свойству Key, чтобы найти ключ и перечислить его для обработки сгруппированных элементов. Мы делаем это в приведенном выше коде.

Что касается n в GroupBy лямбде, то он просто представляет каждый из элементов в eqList по очереди; Отсюда следует, что его тип TeleDBData. Я выбрал n в качестве имени параметра как сокращение от "узла".

...