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
}

我如何创建一个对象列表,其中每个类别值都有一个字段(因此基本上每个月有 12 个对象一个对象(一月、二月、三月等)。

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

所以结果将有 12 个 ExpectedResult 对象。不知道有多少类别/是个问题。任何快速的建议都会有所帮助。

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)将连接到一个大集合中。

为了避免以后比较字符串,请考虑在一年中的几个月内使用 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

从 KeithS 回答开始,您可以按月分组:

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 回答