fjl*_*eon 2 c# linq anonymous-types data-structures
从高效的数据结构来保存员工的活动?,我有一个 ActividadEmpleado 类型的列表,声明为:
public string Empleado { get; set; }
public DateTime Fecha { get; set; }
public string Actividad { get; set; }
Run Code Online (Sandbox Code Playgroud)
LINQ 查询变量以我需要的方式对结果重新排序,即按日期存储,然后按 ActividadEmpleado 和字符串存储。但是,var 类型不能传递给方法,所以搜索这个网站我发现我要么需要创建一个类来存储结果或修改 LINQ 变量以返回一个列表,但我在正确声明方面遇到了问题.
LINQ 变量是:
var queryActividades = listaActividad
.GroupBy(a => a.Fecha, (fecha, fechaActividades) => new
{
Fecha = fecha,
FechaActividades = fechaActividades
.GroupBy(a => a.Empleado, (nombreEmpleado, actividadesEmpleado) => new
{
Actividades = actividadesEmpleado,
NombreEmpleado = nombreEmpleado
})
.OrderBy(a => a.NombreEmpleado)
})
.OrderBy(a => a.Fecha);
Run Code Online (Sandbox Code Playgroud)
Visual Studio 说 queryActividades 是:
IOrderedEnumerable<'a>
Anonymous Types:
'a new datetime fecha, iorderedenumerable<'b>
'b new IEnumerable<ActividadEmpleado> Actividades, string NombreEmpleado
Run Code Online (Sandbox Code Playgroud)
我需要将 queryActividades 传递给另一种方法。我尝试将它作为对象传递,但随后我丢失了扩展方法,例如 Where<>(我可以以某种方式投射它吗?)
我还读到将结果声明为元组应该有效,但我认为声明一个新类更清晰。
我刚开始使用 LINQ,我已经避免使用常规数据结构,但在这种情况下它真的很有帮助,并且想知道如何处理其中的匿名类型或将结果转换为常规列表
最终解决方案:
class GrupoActividad
{
public DateTime Fecha { get; set; }
public IEnumerable<Actividad> Actividades { get; set; }
}
class Actividad
{
public IEnumerable<ActividadEmpleado> Actividades { get; set; }
public string NombreEmpleado { get; set; }
}
var queryActividades = listaActividad
.GroupBy(a => a.Fecha, (fecha, fechaActividades) => new GrupoActividad
{
Fecha = fecha,
Actividades = fechaActividades
.GroupBy(a => a.Empleado, (nombreEmpleado, actividadesEmpleado) => new Actividad
{
Actividades = actividadesEmpleado,
NombreEmpleado = nombreEmpleado
})
.OrderBy(a => a.NombreEmpleado)
})
.OrderBy(a => a.Fecha);
Run Code Online (Sandbox Code Playgroud)
领取方式:
var actividades = from a in queryActividades
where a.Fecha == fechaCiclo
select new { a.Fecha, a.Actividades };
foreach (var item in actividades)
{
//cycle that holds each day's activities
foreach (var empleado in item.Actividades)
{
//cycle that holds each employee with activities in that day
foreach (var actividad in empleado.Actividades)
{
//final cycle that actually reads the activity
ActividadEmpleado actividadEmpleado = (ActividadEmpleado)actividad;
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在您正在创建一个基于匿名类型(实际上是两个匿名类型)的集合,它实际上不能传递给另一个方法(除了使用反射或dynamic)。最简洁的方法是创建一个代表集合的具体类型——比如
public class ActivityGroup
{
public DateTime Fecha {get; set;}
public IEnumerable<Activity> Activities {get; set;}
}
public class Activity
{
public IEnumerable<Activity> Actividades {get; set;}
public string NombreEmpleado {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
然后将您的查询更改为:
var queryActividades = listaActividad
.GroupBy(a => a.Fecha, (fecha, fechaActividades) => new ActivityGroup
{
Fecha = fecha,
FechaActividades = fechaActividades
.GroupBy(a => a.Empleado, (nombreEmpleado, actividadesEmpleado) => new Activity
{
Actividades = actividadesEmpleado,
NombreEmpleado = nombreEmpleado
})
.OrderBy(a => a.NombreEmpleado)
})
.OrderBy(a => a.Fecha);
Run Code Online (Sandbox Code Playgroud)
并将其作为 IEnumerable<ActivityGroup>