1. ホーム
  2. c#

[解決済み】groupbyとcountを使ったLINQ

2022-04-02 23:16:19

質問

とても簡単なことなのですが、困っています。 このようなデータセットがあるとします。

UserInfo(name, metric, day, other_metric)

と、このサンプルデータセット。

joe  1 01/01/2011 5
jane 0 01/02/2011 9
john 2 01/03/2011 0
jim  3 01/04/2011 1
jean 1 01/05/2011 3
jill 2 01/06/2011 5
jeb  0 01/07/2011 3
jenn 0 01/08/2011 7

メトリクスを順番に(0,1,2,3...)カウントの総発生回数で並べたテーブルを取り出したいのですが。つまり、このセットから、最終的には

0 3    
1 2    
2 2    
3 1

LINQの構文に取り組んでいますが、groupbyとcountをどこに置くかで行き詰っています...。 何かいい方法はないでしょうか?

POST編集:投稿された回答は、常に異なるカウント数で1つのレコードを返すため、動作させることができませんでした。しかし、LINQ to SQLのサンプルを作成し、動作させることができました。

var pl = from r in info
         orderby r.metric    
         group r by r.metric into grp
         select new { key = grp.Key, cnt = grp.Count()};

この結果、「メトリクス」とそれぞれに関連するユーザー数を持つレコードの順序付きセットを得ることができました。私は明らかにLINQの初心者ですが、素人目にはこのアプローチは純粋なLINQのアプローチと非常に似ているように見えますが、異なる答えを与えてくれました。

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

を呼び出した後 GroupBy を実行すると、一連のグループ IEnumerable<Grouping> ここで、各グループ化自体は Key は、グループを作成するために使用され、また IEnumerable<T> は、元のデータセットにあるあらゆる項目の を呼び出すだけです。 Count() をグループ化することで、小計を得ることができます。

foreach(var line in data.GroupBy(info => info.metric)
                        .Select(group => new { 
                             Metric = group.Key, 
                             Count = group.Count() 
                        })
                        .OrderBy(x => x.Metric))
{
     Console.WriteLine("{0} {1}", line.Metric, line.Count);
}


> すばらしい迅速な回答でしたが、最初の行、特に "data.groupby(info=>info.metric)" で少し問題があります。

すでにいくつかのリスト/配列を持っていると仮定します。 class のようなものです。

class UserInfo {
    string name;
    int metric;
    ..etc..
} 
...
List<UserInfo> data = ..... ;

をすると data.GroupBy(x => x.metric) これは、各要素について x で定義されるIEnumerableの中で data を計算し、それを .metric 次に、同じメトリックを持つすべての要素をグループ化して Grouping を返し IEnumerable を生成します。例のデータセット

    <DATA>           | Grouping Key (x=>x.metric) |
joe  1 01/01/2011 5  | 1
jane 0 01/02/2011 9  | 0
john 2 01/03/2011 0  | 2
jim  3 01/04/2011 1  | 3
jean 1 01/05/2011 3  | 1
jill 2 01/06/2011 5  | 2
jeb  0 01/07/2011 3  | 0
jenn 0 01/08/2011 7  | 0

とすると、groupbyの後に以下のような結果になります。

(Group 1): [joe  1 01/01/2011 5, jean 1 01/05/2011 3]
(Group 0): [jane 0 01/02/2011 9, jeb  0 01/07/2011 3, jenn 0 01/08/2011 7]
(Group 2): [john 2 01/03/2011 0, jill 2 01/06/2011 5]
(Group 3): [jim  3 01/04/2011 1]