C# 两个嵌套列表中的透视数据<;T>;与林克
我的班级结构如下:C# 两个嵌套列表中的透视数据<;T>;与林克,c#,linq,pivot-table,C#,Linq,Pivot Table,我的班级结构如下: class Employee() { public String Name { get; set; } public List<WorkDay> WorkDays { get; set; } } class WorkDay() { public DateTime Date { get; set; } public Int Hours { get; set; } } 这很棘手,因为它是两个嵌套列表,我只找到了一个非常简单的列表示例。 我说到这一
class Employee()
{
public String Name { get; set; }
public List<WorkDay> WorkDays { get; set; }
}
class WorkDay()
{
public DateTime Date { get; set; }
public Int Hours { get; set; }
}
这很棘手,因为它是两个嵌套列表,我只找到了一个非常简单的列表示例。
我说到这一点,但还没有完全做到:
var _result = Employees.SelectMany(x => x.WorkDays)
.GroupBy(x => x.Date)
.Select(y => new
{
DATE = y.Key,
NAME = y.Select(z => z.Employee.Name).ToArray()
})
.ToList();
如果您有任何建议,我将不胜感激。我想您需要:-
var result = employees.SelectMany(x => x.WorkDays, (employeeObj, workDays) =>
new { employeeObj, workDays })
.GroupBy(x => x.workDays.Date)
.Select(x => new
{
Date = x.Key,
NameAndHours = x.Select(z =>
new {
Name = z.employeeObj.Name,
Hours = z.workDays.Hours
})
}).ToList();
下面是一些示例数据的示例。此示例使用WPF,但您也可以对Winforms或Webforms使用“PivotWorkingHours”方法 输出: 窗口:
<Window x:Class="WpfApplication5.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<DataGrid Name="pivotTarget" ItemsSource="{Binding}"/>
</Grid>
</Window>
实施:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
List<Employee> demo = new List<Employee>
{
new Employee{Name = "Frank", WorkDays = new List<WorkDay>
{
new WorkDay{Date = new DateTime(2001,1,2), Hours = 8},
new WorkDay{Date = new DateTime(2001,1,3), Hours = 7},
}},
new Employee{Name = "Herbert", WorkDays = new List<WorkDay>
{
new WorkDay{Date = new DateTime(2001,1,2), Hours = 8},
new WorkDay{Date = new DateTime(2001,1,4), Hours = 7},
}}
};
pivotTarget.DataContext = PivotWorkingHours(demo);
}
private DataTable PivotWorkingHours(IEnumerable<Employee> employees)
{
DataTable result = new DataTable();
result.Columns.Add("Date", typeof(DateTime));
foreach (string name in employees.Select(x => x.Name).Distinct())
{
result.Columns.Add(name, typeof(int));
}
foreach (DateTime date in employees.SelectMany(e => e.WorkDays.Select(wd => wd.Date)).Distinct())
{
DataRow row = result.NewRow();
row["Date"] = date;
foreach (Employee employee in employees)
{
row[employee.Name] = employee.WorkDays.Where(wd => wd.Date == date).Sum(wd => wd.Hours);
}
result.Rows.Add(row);
}
return result;
}
}
class Employee
{
public String Name { get; set; }
public List<WorkDay> WorkDays { get; set; }
}
class WorkDay
{
public DateTime Date { get; set; }
public int Hours { get; set; }
}
公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
列表演示=新列表
{
新员工{Name=“Frank”,工作日=新名单
{
新工作日{日期=新日期时间(2001,1,2),小时数=8},
新工作日{日期=新日期时间(2001,1,3),小时数=7},
}},
新员工{Name=“Herbert”,工作日=新名单
{
新工作日{日期=新日期时间(2001,1,2),小时数=8},
新工作日{日期=新日期时间(2001,1,4),小时数=7},
}}
};
pivotTarget.DataContext=PivotWorkingHours(演示);
}
专用数据表数据透视工时(IEnumerable employees)
{
DataTable结果=新DataTable();
添加(“日期”,typeof(DateTime));
foreach(employees.Select(x=>x.name).Distinct()中的字符串名称)
{
Add(name,typeof(int));
}
foreach(employees.SelectMany中的DateTime日期(e=>e.WorkDays.Select(wd=>wd.date)).Distinct())
{
DataRow row=result.NewRow();
行[“日期”]=日期;
foreach(员工中的员工)
{
行[employee.Name]=employee.WorkDays.Where(wd=>wd.Date==Date).Sum(wd=>wd.Hours);
}
结果.行.添加(行);
}
返回结果;
}
}
班级员工
{
公共字符串名称{get;set;}
公共列表工作日{get;set;}
}
班级工作日
{
公共日期时间日期{get;set;}
公共整数小时数{get;set;}
}
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
List<Employee> demo = new List<Employee>
{
new Employee{Name = "Frank", WorkDays = new List<WorkDay>
{
new WorkDay{Date = new DateTime(2001,1,2), Hours = 8},
new WorkDay{Date = new DateTime(2001,1,3), Hours = 7},
}},
new Employee{Name = "Herbert", WorkDays = new List<WorkDay>
{
new WorkDay{Date = new DateTime(2001,1,2), Hours = 8},
new WorkDay{Date = new DateTime(2001,1,4), Hours = 7},
}}
};
pivotTarget.DataContext = PivotWorkingHours(demo);
}
private DataTable PivotWorkingHours(IEnumerable<Employee> employees)
{
DataTable result = new DataTable();
result.Columns.Add("Date", typeof(DateTime));
foreach (string name in employees.Select(x => x.Name).Distinct())
{
result.Columns.Add(name, typeof(int));
}
foreach (DateTime date in employees.SelectMany(e => e.WorkDays.Select(wd => wd.Date)).Distinct())
{
DataRow row = result.NewRow();
row["Date"] = date;
foreach (Employee employee in employees)
{
row[employee.Name] = employee.WorkDays.Where(wd => wd.Date == date).Sum(wd => wd.Hours);
}
result.Rows.Add(row);
}
return result;
}
}
class Employee
{
public String Name { get; set; }
public List<WorkDay> WorkDays { get; set; }
}
class WorkDay
{
public DateTime Date { get; set; }
public int Hours { get; set; }
}