在LinqPAD中将字典列表可视化为数据网格?

时间:2013-12-11 21:24:17

标签: c# dictionary visualization linqpad

我喜欢LinqPAD中.Dump()扩展方法的强大功能,并希望用它来将Dictionary<string,string>列表可视化为数据网格,其中键是列名,值是单个值分别

基本上我想要达到的目标是:

Table Visualisation

而不是(目前正在)

Dictionary entries

4 个答案:

答案 0 :(得分:5)

您可以将其转换为ExpandoObjects

listOfDictionaries.Select(x => x.ToExpando()).ToList().Dump();


public static ExpandoObject ToExpando(this IDictionary<string, string> dict)
{
    var expando = new ExpandoObject();
    var expandoDic = (IDictionary<string, object>)expando;
    foreach (var kvp in dict)
        expandoDic.Add(kvp.Key, kvp.Value);
    return expando;
}

List<ExpandoObject> with two columns: "one" and "two"

答案 1 :(得分:5)

您可以创建一个DataTable,它应该在两种模式下正确显示。

使用类似

的扩展方法
public static DataTable ToDataTable<T>(this IEnumerable<Dictionary<string,T>> source)
{
    DataTable table = new DataTable(); 
    foreach(var dict in source)
    {
        var dr = table.NewRow();
        foreach(var entry in dict)
        {
            if (!table.Columns.Contains(entry.Key))
                table.Columns.Add(entry.Key, typeof(T));
            dr[entry.Key] = entry.Value;
        }
        table.Rows.Add(dr);
    }

    return table;       
}
然后,您可以执行类似

的操作
 listOfDictionaries.ToDataTable().Dump();

答案 2 :(得分:2)

怎么样只是

listOfDictionaries.Select(d => new { One = d["one"], Two = d["two"] })

答案 3 :(得分:1)

我找到了影响列名称的正确方法:根据LinqFAQ,必须实现LINQPad.ICustomMembershipProvider

Dictionary<string,string> Keys为列名和Values实际值,只需将以下代码添加到My Extesions

public class KVEntry : Dictionary<string,string>, LINQPad.ICustomMemberProvider
{
    IEnumerable<string> ICustomMemberProvider.GetNames() 
    {
        return Keys;
    }

    IEnumerable<Type> ICustomMemberProvider.GetTypes()
    {
        return Enumerable
                .Repeat(typeof(string),Count);
    }

    IEnumerable<object> ICustomMemberProvider.GetValues()
    {
        return Values;
    } 

    public KVEntry(Dictionary<string,string> data) : base(data){}
}

现在必须在LINQPad查询中使用KVEntry而不是Dictionary<string,string>。这允许我正确渲染我的对象,甚至可以将网格导出到Excel。

Correct Grid

不幸的是,这对于Results to Data Grids模式不起作用,其中LINQPad(可能是设计)完全忽略了ICustomMemberProvider