【问题标题】:C# + get list from list [closed]C# + 从列表中获取列表 [关闭]
【发布时间】:2016-05-06 14:58:19
【问题描述】:

我对 C# 比较陌生。我正在尝试以下一种方式从 List 中获取 List:

模型数据:

string productId
string productName
string depotName
int quantity

List< Data > FullList

示例:

产品1 |产品1 |仓库1 | 1.00

产品1 |产品1 |仓库2 | 2.00

产品1 |产品1 |仓库3 | 0.00

产品2 |产品2 |仓库1 | 2.00

产品2 |产品2 |仓库2 | 5.00

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

List< Data > NewList

产品1 |产品1 |仓库 1,仓库 2 | 3.00

产品2 |产品2 |仓库 1,仓库 2 | 7.00

我想通过product_id, sum(quantity) 和连接仓库名称字符串对列表中的项目进行分组。

我尝试达到某个点(使用GroupBy(x =&gt; x.product_id)Distinct() 分组并获得不同的值,但我无法获得sum(quantity)

谁能帮帮我。

非常感谢。

【问题讨论】:

  • 你认为这个不可编辑的帖子是个问题吗?
  • 对不起,什么是不可读的?你能看到我写的字母、文字……或者有问号或一些奇怪的数据吗?
  • 你发帖后有没有看你的问题?你在开玩笑吗?顺便说一句:我不是需要帮助的人。所以傲慢对你帮助不大。
  • 我看过了。我不打算争论,并花时间这样。在我的生活中,我喜欢用适当的名字来称呼事物。如果某些东西是“不可读的”,那么,我的猜测是,你无法阅读它。如果您可以阅读它,那么您可能不喜欢所写的问题形式。我注意到了模型类的例子,2个列表的例子,我想要得到的例子,并用清晰的句子写下了我尝试得到的东西以及我需要帮助的地方。我很乐意在论坛上获得帮助。
  • 英语不是我的母语,所以我可能用“unredable”措辞错误,但这不会改变您问题的质量。 -4 应该向你展示一些东西。

标签: c# linq list


【解决方案1】:

更新:

此实现不使用 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; }
    }

输出:

产品1 |产品1 |仓库 1,仓库 2,仓库 3 | 3.00

产品2 |产品2 |仓库 1,仓库 2 | 7.00

【讨论】:

  • 您可能会在没有任何解释的情况下对答案投反对票。 “试试这个”在回答中真的没有用处......
  • 好的,谢谢提醒。我向它添加了一些信息
【解决方案2】:
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 获取所有仓库名称。

【讨论】:

  • 谢谢。你的帖子很干净,简短,给我我正在寻找的答案。另外,我要感谢其他人提供有用的 cmets。为了获得连接仓库名称,我没有使用 Concat()。我是这样解决的:depotName = g.Select(q =&gt; q.depotName).Aggregate((e,r) =&gt; e + "," + r)
  • 而且,因为我只需要数量大于 0 的仓库名称,我添加了:depotName = g.Where(z =&gt; z.quantity&gt;0).Select(q =&gt; q.depotName).Aggregate((e,r) =&gt; e + "," + r)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-25
  • 1970-01-01
  • 2021-01-30
相关资源
最近更新 更多