如何使用LINQ将数组对象转换为另一个对象?

3

我有一个C#中的匿名对象列表,这些对象包含以下字段,这些对象是从一个LINQ查询中派生出来的。

{ 
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个对象,每个月一个对象(1月、2月、3月等))。

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

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


那么新的对象看起来会像 var Jan = { Cat1Name = 1.3, Cat2Name = 15.5, Cat3Name = 90.6, ... }?如果类别名称不是有效的 C# 标识符,该怎么办? - mellamokb
我想创建一个变量newItem = new { Month = Jan, Cat1Name = 1.3, cat2Name= 13.5...}。 - Kishor Patil
1
由于字段名称将动态生成,因此使用这个匿名对象会很困难。您的目标是什么?这些新对象将如何使用? - mellamokb
如果您想将结果投射到具有来自Category的值名称的属性类型中,则@mellamokb是正确的。 - Adrian Iftode
1
我会将列表转换为Json并传递给Javascript。 - Kishor Patil
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个新匿名对象组成的数组,然后这些数组(作为可枚举对象)将被连接成一个大集合。
为了避免以后比较字符串,请考虑使用一种月份的枚举类型(不幸的是.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}
                                 });

这不是 OP 需要的。他想要以下定义的几个匿名类:{ public string Month, public decimal Category1, public decimal Category2, public decimal Category3 },其中 Category1..n 是来自先前查询的值。这是不可能的(除非发出 IL 代码 :))。 - Adrian Iftode
@KeithS,我试了你的解决方案。它创建了多个条目。我们期望的是12条记录的汇总结果 - 每个月一条。不幸的是,一旦你创建了新类别,我就无法对它们进行分组。 - Kishor Patil

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将值存储为属性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接