これは非常に簡単ですが、私は迷っています。このタイプのデータセットを考えます。
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のアプローチと非常によく似ているようですが、別の答えを得ました。
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]
userInfoList
がList<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番目のオカレンスでは、n
はGrouping
型です。これは今ではGrouping
オブジェクトのリストだからです。
Grouping
sは.Count()
、.Key()
のような拡張メソッドとあなたが期待する他のほとんど何でも持っています。 string
に対して.Lenght
をチェックするのと同じように、グループに対して.Count()
をチェックすることができます。
userInfos.GroupBy(userInfo => userInfo.metric)
.OrderBy(group => group.Key)
.Select(group => Tuple.Create(group.key, group.Count()));