【问题标题】:How to add List<T> containing item of type List<string> ,int,string into another List如何将包含 List<string> ,int,string 类型项目的 List<T> 添加到另一个 List
【发布时间】:2013-07-23 17:05:14
【问题描述】:

我有一个包含复杂数据的列表

public class CAR
{    
public int ID {get ; set ; }
public string Name { get ; set ; }
public string EngineType { get ; set ; }
public List<string> Months { get; set; }

}

请注意,Months 数据为 List&lt;string&gt;,其最大计数为 150

List<CAR> A = new List<CAR>();
List<CAR> B = new List<CAR>();

A 有以下数据

 ID  |  Name  | EngineType |  Months[0] | Months[1] |  Months[2] |  Months[3]  .. | Months[149] | 
   1   |  Zen   |  1001      |  1         | 1         |  4         |  5        ..   | 6           |
   2   |  Benz  |  2002      |  6         | 4         |  5         |  6        ..   | 2           |
   3   |  Zen   |  1001      |  3         | 1         |  7         |  5        ..   | 0           |
   4   |  Zen   |  1001      |  2         | 2         |  4         |  5        ..   | 6           |
   5   |  Zen   |  2002      |  2         | 2         |  4         |  5        ..   | 6           |
   6   |  Benz  |  2002      |  1         | 1         |  1         |  1        ..   | 1           |

如果 EngineTypeName 相同,我们添加这些行并将结果存储在单行中 例如:添加行

row 1 in B =     1 + 3 + 4
row 2 in B =     2 + 6
row 3 in B =     5

B 应包含以下操作

   ID  |  Name  | EngineType |  Months[0] | Months[1] |  Months[2] |  Months[3] ... | Months[149] | 
   -   |  Zen   |  Petrol    |  6         | 4         |  15        |  15       ..   | 12          |
   -   |  Benz  |  Diesel    |  7         | 5         |  6         |  7             | 3           |        
   -   |  Zen   |  Diesel    |  2         | 2         |  4         |  5        ..   | 6           |

如果月份数据是整数类型的单独实体,我本来可以这样做

B = from val in A 
      group val by  new val.EngineType into g 
          select new CAR{
        EngineType = g.Key, 
        Name = g.Name,
                Month0 = g.Sum(p => p.Month0),
                Month1 = g.Sum(p => p.Month1),
                Month2 = g.Sum(p => p.Month2),
            .
        .
        .
        .
        .
        .
                Month148 = g.Sum(p => p.Month148),
                Month149 = g.Sum(p => p.Month149)
}.ToList<CAR>();

但由于它的类型为List&lt;string&gt;,有没有办法完成这项工作? 非常感谢!

【问题讨论】:

  • 您必须将Parse 字符串转换为数字,执行计算,然后将ToString() 结果转换为目标字符串。
  • 另一方面,您的最后一个代码示例似乎是错误的。它应该是Month[0],您可能应该使用循环而不是单独分配每个月。
  • 我不会想出如此丑陋且不可维护的代码和方法,而是将其分解为可重用的方法/组件。你在做的事情一开始就感觉不对。那么如果你有内存中的数据,将它们分解成更小的方法无论如何都不会影响性能。

标签: c# asp.net linq list


【解决方案1】:

使用 LINQ 的强大功能:

var B = A.GroupBy(x => new { x.Name, x.EngineType })
         .Select(g => new Car
         {
             Name = g.Key.Name,
             EngineType = g.Key.EngineType,
             Months = g.SelectMany(x => x.Months.Select((y,i) => new { i, y = int.Parse(y) }))
                       .GroupBy(x => x.i)
                       .OrderBy(g2 => g2.Key)
                       .Select(g2 => g2.Sum(x => x.y).ToString()).ToList()
         }).ToList();

【讨论】:

    【解决方案2】:
            foreach (CAR c in A)
            {
                bool blnadded = false;
                if (B.Count == 0)
                {
                    B.Add(c);
                    blnadded = true;
                }
                else
                    foreach (CAR d in B)
                    {
                        if (d.Name == c.Name && d.EngineType == c.EngineType)
                        {
                            for (int i = 0; i < d.Months.Count; i++)
                                d.Months[i] = (Convert.ToInt32(d.Months[i]) + Convert.ToInt32(c.Months[i])).ToString();
                            blnadded = true;
                        }
                    }
                if (blnadded==false)
                    B.Add(c);
            }
    

    【讨论】:

      猜你喜欢
      • 2012-12-26
      • 2017-03-11
      • 2017-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多