合并收藏中的类似物品

时间:2018-09-07 16:06:11

标签: c# list collections nested

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

问题是我有多个相同的产品,具有不同的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);
        }
    }
}

除了混乱之外,此代码还会添加所有具有相同名称的产品,然后将其删除。

我不介意代码是否一团糟,只要能够正常工作,我将尝试清理它。不过,如果您有关于如何清理的建议,我将不胜感激。

那么,这个问题。

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

谢谢。

1 个答案:

答案 0 :(得分:0)

我使用类来模拟您的混乱情况。然后应用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; }
    }