1. ホーム
  2. c#

LinqクエリのGroup Byと先頭アイテムの選択

2023-09-16 12:02:09

質問

以下のような文字列の配列があります。

// 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> という名前のボタン・タイプに入力します。 mainButtons

これは、グループ化のために Category :

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

メインのListの各グループの最初の項目を選択するにはどうすればよいですか?(それぞれを繰り返し、別のListに追加することなく?)

どのように解決するのですか?

参照 LINQ: group by節で最新/最後のレコードを取得する方法

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

mainButtonsはすでに正しくソートされているものとします。

カスタムのソート順を指定する必要がある場合は、ComparerでOrderByのオーバーライドを使用します。

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

私の投稿の例を参照してください。 カスタムコンパラを使用してグループの最初の行を選択する。 を参照してください。