Объединить похожие предметы в коллекции - PullRequest
0 голосов
/ 07 сентября 2018

У меня есть коллекция продуктов внутри коллекции области внутри designset, которая находится внутри работы, у меня много вложенных коллекций.

Проблема в том, что у меня есть несколько одинаковых продуктов с разными идентификаторами, которые мне нужно объединить в один, чтобы кто-то, глядя на бумагу, совершил меньше ошибок и мог просто посмотреть на количество.

Итак, мне нужно объединить продукты, но на самом деле мне просто нужно удалить все продукты с таким же именем и добавить их количество к количеству того, который не был удален.

Я могу получить список всех, что мне нужно удалить, к сожалению, в этот список входят и те, которые я не хочу удалять.

Вот что у меня есть:

Я получаю список продуктов

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);
                }
            }
        }
    }
}

Затем я снова перебираю все, но на этот раз я создаю другой список внутри deignset, чтобы перечислить продукты, которые я собираюсь удалить.

Я также перебираю ранее созданный список, чтобы посмотреть, есть ли у меня продукты с таким же 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 голосов
/ 07 сентября 2018

Я использовал классы, чтобы симулировать ваш беспорядок. Затем применил 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; }
    }
...