Подтвердить что ты не робот

Сортировка и группировка в LINQ

У меня есть список строковых кортежей, скажем (P1, P2)

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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