如何使用LINQ将数组对象转换为另一个数组对象
本文关键字:对象 数组 另一个 转换 何使用 LINQ | 更新日期: 2023-09-27 18:30:07
我有一个匿名对象列表,其中包含从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个对象,每个月(1月、2月、3月等)一个对象)。
ExpectedResult {
string Month,
decimal category1,
decimal category2,
decimal category3,
...
decimal categoryN
}
所以result将有12个ExpectedResult对象。不知道有多少类别是个问题。任何快速的建议都会很有帮助。
您可以尝试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没有内置Enum):
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}
});
从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将值存储为属性。