Описание проблемы:
У меня есть сценарий списка 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}"
.
Как выбрать производство и продукт:
- Приоритетные продукты от всех производителей с заказом по
string[] ProductPriotizeList
=> new[] { "P1", "P8", "P5", "P2" ... };
- Заказ по самой низкой цене и получить его
QualityId
. - Построить
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
]
}
Мой вопрос:
Как добиться того же результата выбранных клавиш без загрязнения моего приложения дополнительной моделью? и без повторения всего списка снова.