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 };
Как я могу выбрать первый элемент каждой группы в моем основном списке? (без повторения каждого и добавления в другой список?)
Ответы
Ответ 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() здесь, поскольку первая может использоваться только как конечная операция запроса.