1

我有多个具有多个值的列表,这些值可能具有或不具有相同数量的项目。我只需要按索引将不同名称的数字相加。

继承人一些代码来帮助解释......

    public static List<p> pList= new List<p>();
    public class p
    {
        public string name;
        public double sum;
        public List<double> ip;
    }

所以,我有“p”类,作为一个列表..“p”类中的一些名称将相同而一些不同..

我只需要对具有相同名称的类“p”的索引求和“ip”中的值。

数据示例..

name = a, sum = 10, ip = {2,2,2,2,2}    
name = a, sum = 10, ip = {0,0,5,5}    
name = a, sum = 5, ip = {0,0,5}    
name = b, sum = 20, ip = {0,20}    
name = b, sum = 10, ip = {10}    

结果..

name = a, sum = 25, ip = {2,2,12,7,2}    
name = b, sum = 30, ip = {10,20}    

下面是我已经写的代码..

List<p> distinctmerge = pList
                         .GroupBy(t => t.name)
                         .Select(g => new p
                         {
                             name = g.Select(a => a.name).FirstOrDefault(),
                             sum = g.Sum(a => a.sum),
                             ip = new List<double>() { 1, 2, 3 }
                         }).ToList();

我无法弄清楚的部分在这里..

ip = new List<double>() { 1, 2, 3 }
4

2 回答 2

3

您可以通过以下方式总结 ip 列表

 ip = Enumerable.Range(0, g.Select(a => a.ip.Length).Max()).Select(idx => g.Select(a => a.ip.ElementAtOrDefault(idx)).Sum()).ToList() 
于 2013-03-03T18:33:03.453 回答
2

可以使用SelectManyand来完成GroupBy

        List<p> distinctmerge = pList
            .GroupBy(t => t.name)
            .Select(g => new p
            {
                name = g.Select(a => a.name).FirstOrDefault(),
                sum = g.Sum(a => a.sum),
                ip = g.SelectMany(a => a.ip.Select((e, i) => new { e, i }))
                      .GroupBy(a => a.i)
                      .OrderBy(a => a.Key)
                      .Select(a => a.Sum(e => e.e))
                      .ToList()
            }).ToList();
于 2013-03-03T18:52:39.917 回答