使用.Linq从List <t>创建自定义对象

时间:2016-08-31 08:37:54

标签: 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; }        //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或其他方法做到这一点?

2 个答案:

答案 0 :(得分:1)

这有点棘手,基于您评论实体可能是动态的(即,不仅仅是EntityXEntityZ)。

要做的第一件事是找出你拥有的实体,这就像从列表中选择它们并使用Distinct一样简单。然后你需要按月分组&amp; year,并使用实体列表构建类似字典的内容(key =实体名称值= 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

答案 1 :(得分:0)

有点令人困惑,但从预期输出中获取,您需要在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 
           });