Объединить подпункты из списка предметов - PullRequest
0 голосов
/ 20 ноября 2018

Я хочу попросить вас о помощи, чтобы объединить все подпункты из списка, который выглядит следующим образом:

public class Subitem
{
    public string Name { get; set; }
    public string Code { get; set; }
    public float Price { get; set; }
}

public class Item
{
    public string Name { get; set; }
    public string Code { get; set; }
    public List<Subitem> Subitems { get; set; }
}



var components = new List<Item>();
components.Add(new Item()
{
    Code = "ItemCode1",
    Name = "Item1Name",
    Subitems = new List<Subitem>
    {
        new Subitem { Code = "SubitemCode1", Price = 32 },
        new Subitem { Code = "SubitemCode2", Price = 21 },
        new Subitem { Code = "SubitemCode3", Price = 11 },
        new Subitem { Code = "SubitemCode4", Price = 51 }
    }
});
components.Add(new Item()
{
    Code = "ItemCode2",
    Name = "Item2Name",
    Subitems = new List<Subitem>
    {
        new Subitem { Code = "SubitemCode5", Price = 11 },
        new Subitem { Code = "SubitemCode6", Price = 22 },
        new Subitem { Code = "SubitemCode7", Price = 52 },
        new Subitem { Code = "SubitemCode8", Price = 63 }
    }
});
components.Add(new Item()
    {
        Code = "ItemCode3",
        Name = "Item3Name",
        Subitems = new List<Subitem>
        {
            new Subitem { Code = "SubitemCode9", Price = 11 },
            new Subitem { Code = "SubitemCode10", Price = 22 },
            new Subitem { Code = "SubitemCode11", Price = 52 },
            new Subitem { Code = "SubitemCode12", Price = 63 }
        }
    });
components.Add(new Item()
    {
        Code = "ItemCode4",
        Name = "Item4Name",
        Subitems = new List<Subitem>
        {
            new Subitem { Code = "SubitemCode13", Price = 11 },
            new Subitem { Code = "SubitemCode14", Price = 22 },
            new Subitem { Code = "SubitemCode15", Price = 52 },
            new Subitem { Code = "SubitemCode16", Price = 63 }
        }
    });

Я хочу объединить все подпункты в модели, которая выглядит следующим образом:

new { Code = SubitemCode1, Price = 32 }
...
new { Code = SubitemCode8, Price = 63 }


new { Code = "SubitemCode1:SubitemCode5", Price = 43 } //11 + 32
...
new { Code = "SubitemCode1:SubitemCode8", Price = 95 } //32 + 63


new { Code = "SubitemCode2:SubitemCode5", Price = ... }
...
new { Code = "SubitemCode2:SubitemCode8", Price = ... }

@EDIT

new { Code = "SubitemCode1:SubitemCode5:SubitemCode9", Price = 54 } // 11 + 32 + 11
...
new { Code = "SubitemCode1:SubitemCode5:SubitemCode12", Price = 96 } // 11 + 32 + 63

new { Code = "SubitemCode1:SubitemCode6:SubitemCode9", Price = ... }
...
new { Code = "SubitemCode1:SubitemCode6:SubitemCode12", Price = ... }
...
new { Code = "SubitemCode1:SubitemCode8:SubitemCode9", Price = ... }
...
new { Code = "SubitemCode1:SubitemCode8:SubitemCode12", Price = ... }

new { Code = "SubitemCode2:SubitemCode5:SubitemCode9", Price = ... }
...

Может кто-нибудь объяснить мне, как это сделать?Может быть 1-5 Элемент и 1-10 в Подпункты в каждом Элемент , и мне нужно иметь все комбинации подпунктов с добавлением цен.

Подпункты из Элемент , в котором они находятся, не комбинируется, только Подпункты из других Элемент

Заранее спасибо,

С наилучшими пожеланиями.

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Хорошо, я думаю, что получил это.

Код выглядит так:

var result = new List<SubItem>(); //list of combined SubItems

var ms = 0; // start index of items from list to combine
var mk = 0; // end index of items from list to combine

for (int i = 0; i < components.Count; i++) // count of all items
{
    if (i == 0) //if there is a first item then we don't combine codes and prices
    {
        for (int mat = 0; mat < components[i].SubItems.Count; mat++)
        {
            var data = components[i].SubItem[mat];
            result.Add(new SubItem { Price = data.Price, Code = data.Code });
            mk = mat; // set last index of SubItem to combine
        }
        continue;
    }

    for (int j = ms; j < mk + 1; j++) // iterate from first to last SubItem to combine them with new SubItems 
    {
        for (int mat = 0; mat < components[i].SubItems.Count; mat++) // iterate through SubItems
        {
            result.Add(new SubItem { Code = result[j].Code + ":" + components[i].SubItem[mat].Code, price = result[j].Price + components[i].SubItem[mat].Price }); // Combine last SubItem with now iterating Subitem.
        }
    }

    ms = mk + 1; // update new start index to combine
    mk = result.Count - 1; // update new end index to combine
}

Я добился того, что хотел.:)

С наилучшими пожеланиями!

0 голосов
/ 20 ноября 2018

Вы можете просто объединить два разных списка, например

var result = components[0].Subitems
             .Join(components[1].Subitems, x => true, y => true, (a, b) => new { Code = a.Code + ":" + b.Code, Price = a.Price + b.Price })
             .ToList();    

ИЛИ , вы можете сделать это, используя linq

var result = from a in components[0].Subitems
             from b in components[1].Subitems
             select new
             {
                 Code = a.Code + ":" + b.Code,
                 Price = a.Price + b.Price
             };

И, наконец, распечатать результат

foreach (var item in result)
{
      Console.WriteLine("Code: " + item.Code + "\t Price: " + item.Price);
}

Выход:

enter image description here

...