我试图创建一个多维数组和后话使用这个相同的多维数组来创建图表,但我不知道如何做到这一点。
我想实现的逻辑如下:
//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);
想象一下这个例子(resultados list):
[id, entidade, entidadeID, unidadeMedida, valor, date]
[1, EntityX, 10, 10, 100, 01-09-16]
[2, EntityX, 10, 10, 80, 02-09-16]
[3, EntityX, 10, 10, 120, 01-10-16]
[4, EntityZ, 10, 10, 100, 01-09-16]
[5, EntityZ, 10, 10, 110, 01-10-16]
现在我想创建一个多维数组按日期分组,并有如下结果:
新对象将从上面的输入生成:
EntityX_Value(该月的总和值)将是一个列,所有值按日期分组
EntityZ_Value相同
[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或其他方法做到这一点?
这有点棘手,基于你评论的事实,实体可以是动态的(即,不仅仅是EntityX
和EntityZ
)。
首先要做的是找出你有哪些实体,这就像从列表中选择它们并使用Distinct
一样容易。然后你需要按月分组。年,并使用实体列表建立类似字典的东西(键=实体名称值= valor
的总和)。
可以。
// 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)
});
实例:http://rextester.com/RGV51846
有点混乱,但是从您预期的输出来看,您需要在date
上进行分组并执行以下操作。
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
});