3

LINQ クエリから派生した C# の次のフィールドを含む匿名オブジェクトのリストがあります。

{ 
String category
decimal Jan
decimal Feb
decimal Mar
decimal Apr
decimal May
decimal Jun
decimal Jul
decimal Aug
decimal Sep
decimal Oct
decimal Nov
decimal Dec
}

カテゴリの値ごとに 1 つのフィールドを持つオブジェクトのリストを作成するにはどうすればよいですか (したがって、基本的に 12 個のオブジェクトが各月 (1 月、2 月、3 月など) に 1 つのオブジェクトになります)。

ExpectedResult {
string Month, 
decimal category1,
decimal category2,
decimal category3,
...
decimal categoryN
}

したがって、result には ExpectedResult の 12 個のオブジェクトが含まれます。カテゴリ数がわからない/問題です。どんな簡単な提案でも役に立ちます。

4

2 に答える 2

2

SelectMany() メソッドを試すことができます。

anonymousList.SelectMany(x=>new[]{
                                    new {Cat=category, Month="Jan", Val=Jan}, 
                                    new {Cat=category, Month="Feb", Val=Feb}, 
                                    ... , 
                                    new {Cat=category, Month="Dec", Val=Dec}
                                 });

ソース匿名オブジェクトごとに、このクエリは 12 個の新しい匿名オブジェクトの配列を生成し、それらの配列 (Enumerables として) を 1 つの大きなコレクションに連結します。

後で文字列を比較するのを避けるために、年の月に Enum を使用することを検討してください (残念ながら、.NET にはビルトインがありません)。

public enum Month
{
   January = 1,
   February = 2,
   ...
   December = 12
}

...

anonymousList.SelectMany(x=>new[]{
                                    new {Cat=category, Month=Month.January, Val=Jan}, 
                                    new {Cat=category, Month=Month.February, Val=Feb}, 
                                    ... , 
                                    new {Cat=category, Month=Month.December, Val=Dec}
                                 });
于 2012-04-04T21:50:33.820 に答える
0

キースの回答から始めて、これを月ごとにグループ化できます。

var results = from x in KeithsAnswer
              group x by x.Month into g
              select new { Month = g.Key, CategoryValues = g.Select(c => new { c.Month, c.Val }).ToArray()};

これをクライアントに直接渡してそこで処理するか、上で指定したフォームが本当に必要な場合は、独自に実装するJavaScriptConverterか、動的/ExpandoObject を使用して値をプロパティとして保存できます。

于 2012-04-04T22:31:53.907 に答える