Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从列表创建自定义对象<;T>;使用.Linq_C#_Arrays_Linq_Multidimensional Array - Fatal编程技术网

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 of
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)
    });

实例:

这个问题有一些问题。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)
    });