【问题标题】:Combine Similar Items in Collection合并集合中的相似项目
【发布时间】:2018-09-07 16:06:10
【问题描述】:

我在工作中的设计集内的一个区域的集合内有一个产品集合,我有很多嵌套集合。

问题是我有多个相同的产品,具有不同的 ID,我需要将它们组合成一个,这样看论文的人会少犯错误,他们可以只看数量。

所以,我需要合并产品,但实际上我只需要删除所有具有相同名称的产品并将其数量添加到未删除的产品的数量中。

我能够获得所有我需要删除的列表,不幸的是,该列表还包括我不想删除的列表。

这是我目前所拥有的:

我得到一个产品列表

var ds = j.DesignSets;

IList<Product> productsList = new System.Collections.Generic.List<Product>();

foreach(var dsa in ds)
{
    foreach(var p in dsa.DesignSetAreas)
    {
        foreach(var pr in p.Products)
        {
            if(pr.ProductMods.Count == 0)
            {
                if(pr.DeliveryCnt == 0)
                {
                    productsList.Add(pr);
                }
            }
        }
    }
}

然后我再次遍历所有内容,但这次我在设计集中创建另一个列表来列出我要删除的产品。

我还遍历了之前创建的列表,看看我是否有任何具有相同 displayName 的产品。

foreach(var dsa in ds)
{
    var deleteProducts = new List<Product>();

    foreach(var p in dsa.DesignSetAreas)
    {
        foreach(var pr in p.Products)
        {
            if(pr.ProductMods.Count == 0)
            {
                if(pr.DeliveryCnt == 0)
                {
                    var partQuantity = 0;
                    var partAmount = 0;

                    foreach(var product in productsList)
                    {
                        if(pr.Display == product.Display)
                        {
                            partQuantity = partQuantity + product.Quantity;

                            partAmount++;

                            pr.Quantity = partQuantity;
                        }
                    }

                    if(partAmount >= 2)
                    {
                        deleteProducts.Add(pr);
                    }
                }
            }
        }

        foreach(var item in deleteProducts)
        {
            p.Products.Remove(item);
        }
    }
}

除了一团糟之外,这段代码会添加所有具有相同名称的产品,然后将它们删除。

我真的不介意代码是否一团糟,我会尝试清理它,只要我可以让它工作我真的不介意。不过,如果您对如何清理它有任何建议,我将不胜感激。

所以,对于这个问题。

如何获取此代码以删除除一个同名产品之外的所有产品?

提前致谢。

【问题讨论】:

    标签: c# list collections nested


    【解决方案1】:

    我用类来模拟你的烂摊子。然后应用Linq:

        class Program
        {
    
            static void Main(string[] args)
            {
                Database j = new Database();
    
                var ds = j.DesignSets;
    
                List<Product> productsList = ds.Select(dsa => dsa.DesignSetAreas.Select(p => p.Products.Where(pr => (pr.ProductMods.Count == 0) && (pr.DeliveryCnt == 0))).SelectMany(x => x)).SelectMany(x => x).ToList();
                var productNames = productsList.GroupBy(x => x.Name).Select(x => x.ToList()).ToList();
    
            }
        }
        public class Database
        {
            public List<DesignSet> DesignSets { get; set; }
        }
        public class DesignSet
        {
            public List<DesignSetArea> DesignSetAreas { get; set; }
        }
        public class DesignSetArea
        {
            public List<Product> Products { get; set; }
        }
        public class Product
        {
            public List<string> ProductMods { get; set; }
            public int DeliveryCnt { get; set; }
            public string Name { get; set; }
        }
    

    【讨论】:

      猜你喜欢
      • 2011-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-03
      • 2012-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多