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

问题描述:

我有一个匿名对象列表,其中包含C#中的以下字段从LINQ查询派生。如何使用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对象的一个​​对象每个月(一月,二月,行军等)。

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

所以结果将ExpectedResult的12个物体 不知道有多少种类/是一个问题 有快捷的建议将是有益的

+0

因此,新对象看起来像'var Jan = {Cat1Name = 1.3,Cat2Name = 15.5,Cat3Name = 90.6,...}'?如果类别名称不是有效的C#标识符,该怎么办? – mellamokb 2012-04-04 21:22:16

+0

我想要一个var newItem = new {Month = Jan,Cat1Name = 1.3,cat2Name = 13.5 ...} – 2012-04-04 21:25:36

+1

什么是原始查询? – Phil 2012-04-04 21:29:38

你可以尝试的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)将被连接成一个大集合。

,只是为了避免以后比较字符串,可以考虑使用一个枚举的一年中的月份(不幸的是.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} 
           }); 
+0

这不是OP所需要的。他希望以下定义的几个匿名类:{public string Month,public decimal Category1,public decimal Category2,public decimal Category3}其中Category1..n是来自上一个查询的值。这是不可能的(不包括发射IL代码:)) – 2012-04-04 23:36:45

+0

@KeithS,试过你的解决方案。它创建了多个条目。我们期望的是12条记录的合并结果 - 每个月一条。不幸的是,一旦你创建了新的类别,我无法将它们分组。 – 2012-04-05 13:38:36

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