Вы можете попробовать использовать метод, который преобразует каждый элемент QuoteboardRow в новый тип, причем каждая цена указана как отдельный элемент.
Для каждого элемента, который должен быть напечатан «транспонированным» способом, вы должны взять объект и преобразовать его в тот же формат, что и у продукта / имени ... Dictionary<string, object>
Метод преобразования элемента в словарь
public static Dictionary<string, object> ConvertItemToDictionary(QuoteboardRow x)
{
Dictionary<string, object> result = new Dictionary<string, object>();
result.Add("Product", x.Product);
foreach (var key in x.Prices.Keys)
{
x.Prices.TryGetValue(key, out Price price);
result.Add($"{key}_L", price.Low);
result.Add($"{key}_H", price.High);
}
return result;
}
Используйте его в своем основном или другом процессе,
BindingList<QuoteboardRow> quoteboard = new BindingList<QuoteboardRow>();
quoteboard.Add(
new QuoteboardRow()
{
Product = "Cement",
Prices = new Dictionary<string, Price>()
{
{ "SupplierA",
new Price() { Low= 101, High= 102 }
},
{ "SupplierB",
new Price() { Low= 101, High= 102 }
},
{ "SupplierC",
new Price() { Low= 101, High= 102 }
}
}
}
);
var result = quoteboard.Select(x => ConvertItemToDictionary(x)).ToList();
Console.WriteLine(JsonConvert.SerializeObject(result, Formatting.Indented));
dataGridView1.DataSource = result;
В консоли у меня было это в качестве вывода, что что бы правильно печатать транспонированным способом. (Я добавил столб в качестве второй записи для тестирования)
[
{
"Product": "Cement",
"SupplierA_L": 101,
"SupplierA_H": 102,
"SupplierB_L": 101,
"SupplierB_H": 102,
"SupplierC_L": 101,
"SupplierC_H": 102
},
{
"Product": "pillar",
"SupplierA_L": 101,
"SupplierA_H": 104,
"SupplierB_L": 101,
"SupplierB_H": 101,
"SupplierC_L": 101,
"SupplierC_H": 105
}
]