web-dev-qa-db-ja.com

groupbyとcountを使ったLINQ

これは非常に簡単ですが、私は迷っています。このタイプのデータセットを考えます。

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を配置してカウントする場所に固執しています....どんな助け?

POST Edit:投稿された回答が常に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のアプローチと非常によく似ているようですが、別の答えを得ました。

185
Gio

GroupByを呼び出した後、一連のグループIEnumerable<Grouping>を取得します。ここで、各Grouping自体は、グループの作成に使用されたKeyを公開しており、元のデータセットにあるすべての項目のIEnumerable<T>でもあります。小計を取得するには、そのGroupingで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]
339
Jimmy

userInfoListList<UserInfo>であると仮定します。

        var groups = userInfoList
            .GroupBy(n => n.metric)
            .Select(n => new
            {
                MetricName = n.Key,
                MetricCount = n.Count()
            }
            )
            .OrderBy(n => n.MetricName);

GroupBy()n => n.metricのラムダ関数は、検出されたすべてのmetricオブジェクトからフィールドUserInfoを取得することを意味します。リストにはn個のオブジェクトが含まれているため、UserInfoの型はコンテキストに依存します。最初の出現ではUserInfo型です。 2番目のオカレンスでは、nGrouping型です。これは今ではGroupingオブジェクトのリストだからです。

Groupingsは.Count().Key()のような拡張メソッドとあなたが期待する他のほとんど何でも持っています。 stringに対して.Lenghtをチェックするのと同じように、グループに対して.Count()をチェックすることができます。

40
Vladislav Zorov
userInfos.GroupBy(userInfo => userInfo.metric)
        .OrderBy(group => group.Key)
        .Select(group => Tuple.Create(group.key, group.Count()));
20
DanielOfTaebl