C# 使用Linq转换自定义集合

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对象,每个对象都有一个嵌套的项列表

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;