Вид и группа в LINQ

Я имею список строковых кортежей, говорю (P1, P2)

Я хотел бы знать, существует ли оператор LINQ, где я мог сгруппироваться P1 (в порядке возрастания), и сделать, чтобы та группа содержала все значения P2 для группы (в порядке убывания).

Для входа: ("A", "B"), ("A", "C"), ("D", "B") я хотел бы получить две группы: "A" и "D" (в том порядке, каждый раз) то, где группа "A" содержит "C" и "B" (в том порядке, каждый раз) и группа "D", содержит, ну, в общем, "B".

Действительно ли это возможно со встроенными классами LINQ, или я должен выполнить итерации групп и отсортировать их сам?

13
задан Ondrej Janacek 7 March 2014 в 14:44
поделиться

2 ответа

Нет, это несложно - вам просто нужно отслеживать, смотрите ли вы на группу или элементы внутри группы. Вот пример запроса:

var query = from tuple in tuples
            orderby tuple.P1
            group tuple.P2 by tuple.P1 into g
            select new { Group = g.Key,
                         Elements = g.OrderByDescending(p2 => p2) };

Вот полный пример (избегая типа .NET 4 Tuple для простоты, если вы используете .NET 3.5):

using System;
using System.Collections.Generic;
using System.Linq;

public class MyTuple
{
    public string P1 { get; set; }
    public string P2 { get; set; }
}

class Test
{
    static void Main()
    {
        List<MyTuple> tuples = new List<MyTuple>
        {
            new MyTuple { P1 = "A", P2 = "B" },
            new MyTuple { P1 = "A", P2 = "C" },
            new MyTuple { P1 = "D", P2 = "B" },
        };

        var query = from tuple in tuples
            orderby tuple.P1
            group tuple.P2 by tuple.P1 into g
            select new { Group = g.Key,
                         Elements = g.OrderByDescending(p2 => p2) };

        foreach (var group in query)
        {
            Console.WriteLine("{0}:", group.Group);
            foreach (var value in group.Elements)
            {
                Console.WriteLine("  {0}", value);
            }
        }
    }
}

Обратите внимание, что это может быть немного проще, если вы Мы будем рады сделать заказ на основе принципа "необходимости знать":

var query = from tuple in tuples
    orderby tuple.P1
    group tuple.P2 by tuple.P1;

foreach (var group in query)
{
    Console.WriteLine("{0}:", group.Key);
    foreach (var value in group.OrderByDescending(x => x))
    {
        Console.WriteLine("  {0}", value);
    }
}
21
ответ дан 1 December 2019 в 21:37
поделиться
List<Tuple<string, string>> tuples = //
var grouped = tuples.GroupBy(t => t.First)
    .OrderBy(grp => grp.Key)
    .Select(grp => new { Key = grp.Key, Items = grp.OrderBy(t => t.Second) });
4
ответ дан 1 December 2019 в 21:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: