C#+从列表中获取列表

时间:2016-01-29 00:43:38

标签: c# linq list

我对C#比较新。我试图以下一种方式从列表中获取List:

模型数据:

string productId
string productName
string depotName
int quantity

List< Data > FullList

示例:

  

prod1 | product1 | depot1 | 1.00

     

prod1 | product1 | depot2 | 2.00

     

prod1 | product1 | depot3 | 0.00

     

prod2 | product2 | depot1 | 2.00

     

prod2 | product2 | depot2 | 5.00

在我得到这样的列表之后,我想以下一种方式再创建一个列表:

List< Data > NewList
  

prod1 | product1 | depot1,depot2 | 3.00

     

prod2 | product2 | depot1,depot2 | 7.00

我希望按product_id, sum(quantity)对列表中的项目进行分组,并将多个站点名称串联起来。

我尝试达到某种程度(使用GroupBy(x => x.product_id)Distinct()分组和获取不同的值,但我无法获得sum(quantity)

有人可以帮助我。

非常感谢你。

2 个答案:

答案 0 :(得分:0)

var summary = FullList
    .GroupBy(p => p.product_id)
    .Select(g => new {
       product_id = g.product_id,
       product_name = g.First().product_name,
       quantity = g.Sum(p => p.quantity)
     })
     .ToList();

作为练习考虑获取所有仓库名称的Concat

答案 1 :(得分:0)

更新:

此实现不使用linq,但它可以正常工作。不确定访问大量数据时的性能有多好,

代码背后:

List<Data> data = new List<Data>()
            {
                new Data() { productId = "prod1", productName = "product1", depotName = "depot1", quantity = 1 },
                new Data() { productId = "prod1", productName = "product1", depotName = "depot2", quantity = 2 },
                new Data() { productId = "prod1", productName = "product1", depotName = "depot3", quantity = 0 },
                new Data() { productId = "prod2", productName = "product2", depotName = "depot1", quantity = 2 },
                new Data() { productId = "prod2", productName = "product2", depotName = "depot2", quantity = 5 },
            };

            List<Data> newData = new List<Data>();

            foreach(var d in data)
            {
                Data newDataRecord = newData.FirstOrDefault(nd => nd.productId == d.productId);
                if (newDataRecord != null)
                {
                    int newDataRecordIndex = newData.IndexOf(newDataRecord);
                    if(!newDataRecord.depotName.Contains(d.depotName))
                    {
                        newData[newDataRecordIndex].depotName += string.Format(",{0}", d.depotName); // Append to the existing depotName
                    }
                    newData[newDataRecordIndex].quantity += d.quantity; // Add quantity
                }
                else
                {
                    newData.Add(d);
                }
            }

型号:

public class Data
    {
        public string productId { get; set; }
        public string productName { get; set; }
        public string depotName { get; set; }
        public int quantity { get; set; }
    }

输出:

prod1 | product1 | depot1,depot2,depot3 | 3.00

prod2 | product2 | depot1,depot2 | 7.00