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

Linq Query Group и выбор первых элементов

У меня есть массив строк вроде этого:

// icon, category, tool
String[,] subButtonData = new String[,]
{
    {"graphics/gui/brushsizeplus_icon", "Draw", "DrawBrushPlus"},
    {"graphics/gui/brushsizeminus_icon", "Draw", "DrawBrushMinus"},
    {"graphics/gui/freedraw_icon", "Draw", "DrawFree"},
    {"graphics/gui/linedraw_icon", "Draw", "DrawLine"},
    {"graphics/gui/rectangledraw_icon", "Draw", "DrawRectangle"},
    {"graphics/gui/ellipsedraw_icon", "Draw", "DrawEllipse"},
    {"graphics/gui/brushsizeplus_icon", "Brusher", "BrusherBrushPlus"},
    {"graphics/gui/brushsizeminus_icon", "Brusher", "BrusherBrushMinus"},
    {"graphics/gui/brushsizeplus_icon", "Text", "TextBrushPlus"},
    {"graphics/gui/brushsizeminus_icon", "Text", "TextBrushMinus"},
};

Затем я заполняю List<Button> своим типом Button с именем mainButtons

Вот как я запрашиваю для группировки для Category:

var categories = from b in mainButtons
                 group b by b.category into g
                 select new { Category = g.Key, Buttons = g };

Как я могу выбрать первый элемент каждой группы в моем основном списке? (без повторения каждого и добавления в другой список?)

4b9b3361

Ответ 1

См. LINQ: как получить последнюю/последнюю запись с помощью предложения group by

var firstItemsInGroup = from b in mainButtons
                 group b by b.category into g
select g.First();

Я предполагаю, что mainButtons уже отсортированы правильно.

Если вам нужно указать заказный порядок сортировки, используйте OrderBy переопределить с помощью Comparer.

var firstsByCompareInGroups = from p in rows
        group p by p.ID into grp
        select grp.OrderBy(a => a, new CompareRows()).First();

См. пример в моем сообщении Выберите First Row In Group с помощью Custom Comparer"

Ответ 2

var result = list.GroupBy(x => x.Category).Select(x => x.First())

Ответ 3

Прежде всего, я бы не использовал многомерный массив. Только когда-либо видели плохие вещи из этого.

Настройте свою переменную следующим образом:

IEnumerable<IEnumerable<string>> data = new[] {
    new[]{"...", "...", "..."},
    ... etc ...
};

Тогда вы просто пойдете:

var firsts = data.Select(x => x.FirstOrDefault()).Where(x => x != null); 

В случае, если у вас есть пустой список в качестве элемента внутри, убедитесь, что он обрезает любые значения.

В качестве альтернативы вы можете реализовать его как:

string[][] = new[] {
    new[]{"...","...","..."},
    new[]{"...","...","..."},
    ... etc ...
};

Это можно использовать аналогично массиву [x,y], но он используется следующим образом: [x][y]

Ответ 4

var results = list.GroupBy(x => x.Category)
            .Select(g => g.OrderBy(x => x.SortByProp).FirstOrDefault());

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

Примечание. Если вы используете LINQ-to-Entities, вы получите исключение во время выполнения, если вы используете First() вместо FirstOrDefault() здесь, поскольку первая может использоваться только как конечная операция запроса.