C# 使用Linq转换自定义集合
我有一个BindingList对象,每个对象都有一个嵌套的项列表C# 使用Linq转换自定义集合,c#,linq,data-binding,collections,pivot-table,C#,Linq,Data Binding,Collections,Pivot Table,我有一个BindingList对象,每个对象都有一个嵌套的项列表 BindingList<QuoteboardRow> quoteboard = new BindingList<QuoteboardRow>(); quoteboard.Add( new QuoteboardRow() { Product= "Cement", Prices = new Dictionary<string, Price>() {
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 }
}
}
);
dataGridView1.DataSource = quoteboard;
我非常感谢你在这方面的帮助。如果有更好的方法对datagridview和集合进行数据绑定,datagridview是只读的,我将更新集合以反映价格的任何变化 您可以尝试使用一种方法,将QuoteboardRow的每个项目转换为新类型,并将每个价格作为单个项目列出 对于以“转置”方式打印的每个项目,您必须获取一个对象并将其转换为与产品/名称相同的格式<代码>字典 将项转换为字典的方法
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;
}
我会这样做:
public class PriceWrap
{
public string Product { get; set; }
public string Supplier { get; set; }
// you can also add all price fields here, if you only want one level
public Price Price { get; set; }
}
var bl = new BindingList<PriceWrap>();
foreach (var quoteboard in quoteboards)
{
foreach (var kv in quoteboard.Prices)
{
var supplier = kv.Key;
var price = kv.Value;
bl.Add(new PriceWrap() {
Product = quoteboard.Product,
Supplier = supplier,
Price = price
});
}
}
dataGridView1.DataSource = bl;
公共类价格包装
{
公共字符串乘积{get;set;}
公共字符串提供程序{get;set;}
//如果只需要一个级别,也可以在此处添加所有价格字段
公共价格{get;set;}
}
var bl=新绑定列表();
foreach(报价栏中的变量报价栏)
{
foreach(报价单中的var kv.价格)
{
var供应商=千伏钥匙;
无功价格=千伏值;
bl.Add(新的价格包(){
产品=报价板。产品,
供应商=供应商,
价格=价格
});
}
}
dataGridView1.DataSource=bl;
结果将是:
产品、供应商A、低成本、高成本
产品、供应商B、低B、高B
产品、供应商、低成本、高成本
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
}
]
public class PriceWrap
{
public string Product { get; set; }
public string Supplier { get; set; }
// you can also add all price fields here, if you only want one level
public Price Price { get; set; }
}
var bl = new BindingList<PriceWrap>();
foreach (var quoteboard in quoteboards)
{
foreach (var kv in quoteboard.Prices)
{
var supplier = kv.Key;
var price = kv.Value;
bl.Add(new PriceWrap() {
Product = quoteboard.Product,
Supplier = supplier,
Price = price
});
}
}
dataGridView1.DataSource = bl;