C# 从列表创建自定义对象<;T>;使用.Linq
我正试图创建一个多维数组和后记,使用这个多维数组来创建图表,但我不知道如何做到这一点 我想实现的逻辑如下C# 从列表创建自定义对象<;T>;使用.Linq,c#,arrays,linq,multidimensional-array,C#,Arrays,Linq,Multidimensional Array,我正试图创建一个多维数组和后记,使用这个多维数组来创建图表,但我不知道如何做到这一点 我想实现的逻辑如下 //T070_RESULT is an entity .Linq public int id { get; set; } public string entidade { get; set; } public Nullable<int> entidadeID { get; set; } public string unidadeMedida { get; set; }
//T070_RESULT is an entity .Linq
public int id { get; set; }
public string entidade { get; set; }
public Nullable<int> entidadeID { get; set; }
public string unidadeMedida { get; set; } //not relevant for this question
public string valor { get; set; }
public Nullable<System.DateTime> date { get; set; }
//this list contains objects with the structure above
List<T070_RESULT> resultados = ListOfResults(idSample);
现在我想创建一个按日期分组的多维数组,结果如下:
将根据上述输入生成新对象:
EntityX_值(当年当月的合计值)将是一列,所有值按日期分组
EntityZ_值相同
[id, EntityX_Value(summed values for that month of that year), EntityZ_Value, date]
[1, 180, 100, 01-09-16]
[2, 80, 110, 01-10-16]
(关于日期,我不需要日期,我只需要按月份和年份分组)
使用linq或其他方法,我如何做到这一点?有点让人困惑,但从您的预期输出来看,您需要在
日期进行分组,然后执行类似的操作
var result = resultados.GroupBy(x=>x.date)
.Select((x,i)=>
{
id = i+1,
EntityX_Value = x.Where(w=>w.entidade == "EntityX").Sum(s=>s.valor),
EntityZ_Value = x.Where(w=>w.entidade == "EntityZ").Sum(s=>s.valor),
date = x.Key
});
这有点棘手,因为您评论说实体可以通过动态(即,不仅仅是EntityX
和EntityZ
)来实现
首先要做的是找出您拥有的实体,这很容易,只要从列表中选择它们并使用Distinct
。然后,您需要按月份和年份进行分组,并使用实体列表构建类似于字典的内容(key=entity name value=sum ofvalor
)
这会奏效的
// get a distinct list of entities
var entities = list.Select(x => x.entidade).Distinct();
// group your original list, and use the above list to search for the right results
var result = list.GroupBy( x => new {Month = x.date.Value.Month, Year = x.date.Value.Year})
.Select( (x,i) => new {
id = (i+1),
values = entities.ToDictionary(k => k, v => x.Where(y => y.entidade == v).Sum(y => y.valor)),
date = new DateTime(x.Key.Year, x.Key.Month,1)
});
实例:这个问题有一些问题。1) 任何地方都没有多维数组。2) 09-16
不是日期时间的表示形式。3) 什么是EntityX_值
和EntityZ_值
?(您的输入具有unidadeMedida
和valor
)4)结果中的id
来自何处?或者,更基本地说,解释如何从示例输入到示例输出,答案将很简单。您想获得string[]的输出吗
?也许多维数组根本不是最好的方法,也许是实现此目的的其他类型的对象。@Jamiec请回顾这个问题,我希望我已经回答了你的问题,关于它发送的id,不管它是如何生成的,它可以是一个序列。几乎就是这样,我已经给出了这个例子,但我们必须假设实体的数量增加了,或者可能只有一个,我如何才能做到这一点?嗯,这有点挑战性,但你可以做的是再次分组entitiy
,然后通过再次按日期分组来尝试调整结果,但是我对.Linq有点陌生,我不知道如何使用这个aproache创建透视表,因为我使用的是英文变量名。在不知道如何多元化的情况下,entidade
和valor
我不想把事情搞混。没问题,我的坏朋友!只有一个问题,我已经测试过了,但是Sum(y=>y.valor)并没有添加来自同一日期的其他值,关于其余的,我想这就是我正在寻找的吗for@PTLearner-我做了一个假设,改变了一件事。在您的示例中,valor
是一个字符串。我将其更改为int。您可以始终执行.Sum(y=>int.Parse(y.valor))
(或者double.Parse
,如果更合适的话)。如果你在做算术运算,最好首先使用数字类型。如果你不确定,请看我的实例。是的,我已经做了,我会研究一下,并在我完成此操作后将Answer设置为正确
// get a distinct list of entities
var entities = list.Select(x => x.entidade).Distinct();
// group your original list, and use the above list to search for the right results
var result = list.GroupBy( x => new {Month = x.date.Value.Month, Year = x.date.Value.Year})
.Select( (x,i) => new {
id = (i+1),
values = entities.ToDictionary(k => k, v => x.Where(y => y.entidade == v).Sum(y => y.valor)),
date = new DateTime(x.Key.Year, x.Key.Month,1)
});