Как найти элемент min вложенного списка и вернуть его братьев и сестер и идентификаторы родителей - PullRequest
0 голосов
/ 22 апреля 2020

Описание проблемы:

У меня есть сценарий списка Manufacturers, каждый из которых содержит ManufacturerId и вложенный список Products, который содержит ProductId и вложенный список Qualities, который содержит QualityId и Price.

--Manufacturers (List) 
----ManufacturerId (string)
----Products (List)
------ProductId (string)
------Qualities (List) 
    -QualityId (string)
    -Price (decimal)

Или

class Manufacturer { string ManufacturerId { get; set; } IEnumerable<Product> Products { get; set; } }
class Product { string ProductId { get; set; } IEnumerable<Quality> Qualities { get; set; } }
class Quality { string QualityId { get; set; } decimal Price { get; set; } }

Моя цель:

Выберите одно производство и один продукт и составьте список свойств выбранного продукта List<string>, где каждый элемент является ключом, построенным по ключу $"{ManufacturerId}-{ProductId}-{QualityId}".

Как выбрать производство и продукт:

  1. Приоритетные продукты от всех производителей с заказом по string[] ProductPriotizeList => new[] { "P1", "P8", "P5", "P2" ... };
  2. Заказ по самой низкой цене и получить его QualityId.
  3. Построить List<string> ключей $"{ManufacturerId}-{ProductId}-{QualityId}" выбранными братьями QualityId (обратите внимание, что у каждого из выбранных ключей будут одинаковые идентификаторы производителя и идентификатора продукта и они различаются только по качеству).

I пробовал (и это работает):

Я создал класс с именем FlattenQuality, содержащий свойства Quality и объявление определите ManufacturerId и ProductId для него (путем зацикливания каждого из производителей и каждого из продуктов).

class FlattenQuality 
{ 
    string QualityId { get; set; }
    string ManufacturerId { get; set; }
    string ProductId { get; set; }
    decimal Price { get; set; }
    string Key { get { return $"{ManufacturerId}-{ProductId}-{QualityId}"; }
}

Затем составьте список FlattenQuality на SelectMany по производителям и SelectMany по продуктам:

List<FlattenQuality> flattenQualities = BuildFlattenQuality(..);

Затем полученный список выбранных ключей:

List<string> selected = flattenQualities.OrderBy(x => Array.IndexOf(ProductPriotizeList, x.ProductId)).ThenBy(x => x.Price).Select(x => x.MyKey).ToList();

Например:

{
    "Manufacturers": [
    {
        "ManufacturerId": 1,
        "Products": [
        {
            "ProductId": P1,
            "Qualities": [
            {
                "QualityId": 1,
                "Price": 10
            },
            {
                "QualityId": 2,
                "Price": 20
            }]
        }]
    },
    {
        "ManufacturerId": 2,
        "Products": [
        {
            "ProductId": P1,
            "Qualities": [
            {
                "QualityId": 1,
                "Price": 15
            },
            {
                "QualityId": 2,
                "Price": 30
            }]
        }]
    }]
}

Вывод должен быть:

{
    "Keys": [
        "1-1-1", //The QualityId 1 of productId 1 of ManuId 1 is the cheapest
        "2-1-1"  //The cheapest sibling
    ]
}

Мой вопрос:

Как добиться того же результата выбранных клавиш без загрязнения моего приложения дополнительной моделью? и без повторения всего списка снова.

1 Ответ

2 голосов
/ 22 апреля 2020

То, что вы хотите сделать, это сгладить ваши данные. Для этого:

var records = 
    manufacturers.SelectMany(m => 
        m.Products.SelectMany(p =>
            p.Qualities.Select(q => new 
            { 
                ManufacturerId = m.ManufacturerId,
                ProductId = p.ProductId, 
                QualityId = q.QualityId, 
                Price = q.Price,
                Key = string.Join("-", new string [] {m.ManufacturerId, p.ProductId, q.QualityId })
            })
        )
    );

Затем примените логин заказа c:

records.OrderBy(x => Array.IndexOf(productPriotizeList, x.ProductId))
       .ThenBy(x => x.Price);

См. Рабочую демонстрацию здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...