これはかなり単純ですが、困惑しています。このタイプのデータセットが与えられた場合:
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 をどこに置くべきかで行き詰まっています... 何か助けはありますか?
投稿編集: 投稿された回答は、常に異なるカウントの数を含む 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 アプローチと非常に似ているように見えますが、異なる答えが得られました。
ベストアンサー1
を呼び出すとGroupBy
、一連のグループが取得されます。IEnumerable<Grouping>
各 Grouping 自体は、Key
グループの作成に使用された を公開し、元のデータ セットに含まれる項目の も公開します。小計を取得するには、その Grouping を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 = ..... ;
を実行すると、それは「によって定義される IEnumerable のdata.GroupBy(x => x.metric)
各要素について、その を計算し、同じメトリックを持つすべての要素を にグループ化し、結果のすべてのグループの を返す」ことを意味します。 の例のデータ セットを考えると、x
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]