Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C如何以透视格式显示我的数据列表_C#_Pivot - Fatal编程技术网

C# C如何以透视格式显示我的数据列表

C# C如何以透视格式显示我的数据列表,c#,pivot,C#,Pivot,我有以下字段的信息列表: Project State Title ABC Resolved Title1 ABC Pending Title2 DEF Archived Title3 DEF Resolved Title4 DEF Committed Title5 DEF Active Title6 我希望使用c以以下格式输出

我有以下字段的信息列表:

Project    State         Title
  ABC      Resolved      Title1
  ABC      Pending       Title2
  DEF      Archived      Title3
  DEF      Resolved      Title4
  DEF      Committed     Title5
  DEF      Active        Title6
我希望使用c以以下格式输出

Project    Pending      Resolved       Committed     Active
  ABC         2            1              0            3
  DEF         1            3              1            15

private void button2_Click(object sender, EventArgs e)
{
    List<Item> objItems = new List<Item>();

    objItems.Add(new Item(1, "ABC", "Title1", "Resolved"));
    objItems.Add(new Item(2, "ABC", "Title2", "Pending"));
    objItems.Add(new Item(3, "DEF", "Title3", "Archived"));
    objItems.Add(new Item(4, "DEF", "Title4", "Resolved"));
    objItems.Add(new Item(5, "DEF", "Title5", "Committed"));
    objItems.Add(new Item(6, "DEF", "Title6", "Active"));
    objItems.Add(new Item(7, "ABC", "Title2", "Pending"));

    var data = objItems.Pivot(c => c.Project, c => c.State, lst => lst.Sum(c=> c.State)).ToList();
    dataGridView1.DataSource = data;  
}

public class Item
{
    public int Id { get; set; }
    public string Project { get; set; }
    public string Title { get; set; }
    public string State { get; set; }

    public Item(int id, string project, string title, string state)
    {
        this.Id = id;
        this.Project = project;
        this.Title = title;
        this.State = state;
    }
}

    public static class Extension
    {

        public static DataTable ToPivotTable<T, TColumn, TRow, TData>(
            this IEnumerable<T> source,
            Func<T, TColumn> columnSelector,
            Expression<Func<T, TRow>> rowSelector,
            Func<IEnumerable<T>, TData> dataSelector)
        {
            DataTable table = new DataTable();
            var rowName = ((MemberExpression)rowSelector.Body).Member.Name;
            table.Columns.Add(new DataColumn(rowName));
            var columns = source.Select(columnSelector).Distinct();

            foreach (var column in columns)
                table.Columns.Add(new DataColumn(column.ToString()));

            var rows = source.GroupBy(rowSelector.Compile())
                             .Select(rowGroup => new
                             {
                                 Key = rowGroup.Key,
                                 Values = columns.GroupJoin(
                                     rowGroup,
                                     c => c,
                                     r => columnSelector(r),
                                     (c, columnGroup) => dataSelector(columnGroup))
                             });

            foreach (var row in rows)
            {
                var dataRow = table.NewRow();
                var items = row.Values.Cast<object>().ToList();
                items.Insert(0, row.Key);
                dataRow.ItemArray = items.ToArray();
                table.Rows.Add(dataRow);
            }

            return table;
        }

    public static Dictionary<TKey1, Dictionary<TKey2, TValue>> Pivot<TSource, TKey1, TKey2, TValue>(
    this IEnumerable<TSource> source
    , Func<TSource, TKey1> key1Selector
    , Func<TSource, TKey2> key2Selector
    , Func<IEnumerable<TSource>, TValue> aggregate)
        {
            return source.GroupBy(key1Selector).Select(
                x => new
                {
                    X = x.Key,
                    Y = source.GroupBy(key2Selector).Select(
                        z => new
                        {
                            Z = z.Key,
                            V = aggregate(from item in source
                                          where key1Selector(item).Equals(x.Key)
                                          && key2Selector(item).Equals(z.Key)
                                          select item
                            )

                        }
                    ).ToDictionary(e => e.Z, o => o.V)
                }
            ).ToDictionary(e => e.X, o => o.Y);
        } 
    }
这是我从这里得到的枢轴代码

公共静态字典>透视


告诉我如何使用上述Pivot函数排列数据。请告诉我要在代码中更正什么以获得所需的输出。感谢

老实说,您最好使用System.Linq名称空间,并使用GroupBy方法,将特定状态的计数选择到符合所需布局的类类型的新列表中,甚至选择到匿名对象中

一旦数据分组,就可以相应地循环和输出

对于缺少示例表示歉意,我使用的是电池有限的手机,希望这至少为您指明了一个更简单的解决方案: