Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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# 如何将LINQ结果传递给方法?_C#_Linq_Data Structures_Anonymous Types - Fatal编程技术网

C# 如何将LINQ结果传递给方法?

C# 如何将LINQ结果传递给方法?,c#,linq,data-structures,anonymous-types,C#,Linq,Data Structures,Anonymous Types,从中,我有一个ActividaTempleado类型的列表,声明为: public string Empleado { get; set; } public DateTime Fecha { get; set; } public string Actividad { get; set; } LINQ查询变量按照我需要的方式对结果进行重新排序,即按日期存储,然后按ActivityTempleado和字符串存储。但是,var类型不能传递给方法,因此在搜索这个站点时,我发现我需要创建一个类来存储结果

从中,我有一个ActividaTempleado类型的列表,声明为:

public string Empleado { get; set; }
public DateTime Fecha { get; set; }
public string Actividad { get; set; }
LINQ查询变量按照我需要的方式对结果进行重新排序,即按日期存储,然后按ActivityTempleado和字符串存储。但是,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);
Visual Studio说queryActividades是:

IOrderedEnumerable<'a>
Anonymous Types:
'a new datetime fecha, iorderedenumerable<'b>
'b new IEnumerable<ActividadEmpleado> Actividades, string NombreEmpleado

不能在方法之间传递匿名类型;如果需要将数据传递给另一个方法,则需要创建一个包含
Actividades
NombreEmpleado
属性的显式命名类型,以及另一个包含
Fecha
FechaActividades
的类型。现在,您正在创建一个基于匿名类型的集合(实际上是两个匿名类型),实际上不能传递给另一个方法(除了使用反射或
动态

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;}
}

并将其作为
IEnumerable

传递。您可以使用D Stanley提出的方法。但是,为将来编写的任何类似查询创建此类类将有点枯燥。相反,您可以将其作为泛型类引入,如下所示

public class Grouping<TKey, TElement>
{
    public TKey Key { get; set; }
    public IEnumerable<TElement> Elements { get; set; }
}
public static class Grouping
{
    public static Grouping<TKey, TElement> Create<TKey, TElement>(TKey key, IEnumerable<TElement> elements)
    {
        return new Grouping<TKey, TElement> { Key = key, Elements = elements };
    }
}
var queryActividades = listaActividad
    .GroupBy(a => a.Fecha, (fecha, fechaActividades) => Grouping.Create(
        fecha, fechaActividades
            .GroupBy(a => a.Empleado, (nombreEmpleado, actividadesEmpleado) => Grouping.Create(
                nombreEmpleado, actividadesEmpleado))
            .OrderBy(a => a.Key)))
    .OrderBy(a => a.Key);
像这样使用它

public class Grouping<TKey, TElement>
{
    public TKey Key { get; set; }
    public IEnumerable<TElement> Elements { get; set; }
}
public static class Grouping
{
    public static Grouping<TKey, TElement> Create<TKey, TElement>(TKey key, IEnumerable<TElement> elements)
    {
        return new Grouping<TKey, TElement> { Key = key, Elements = elements };
    }
}
var queryActividades = listaActividad
    .GroupBy(a => a.Fecha, (fecha, fechaActividades) => Grouping.Create(
        fecha, fechaActividades
            .GroupBy(a => a.Empleado, (nombreEmpleado, actividadesEmpleado) => Grouping.Create(
                nombreEmpleado, actividadesEmpleado))
            .OrderBy(a => a.Key)))
    .OrderBy(a => a.Key);

OrderBy(a=>a.Fecha).ToList();
?不能传递类型化对象之类的匿名类型,这是行不通的。为什么不使用元组?
var
不是“类型”-它只是让编译器推断出实际的类型。再加上@YuvalItzchakov,如果你在查询中将它们分组为一个自定义类型,那么你就有了一个
IEnumerable
?@DStanley我认为他不是指
var
类型。他是指他为
GroupBy
创建的匿名类型。他没有这样做o将ActivityGroup中的字符串Fecha更改为DateTime Fecha,也将FechaActividades重命名为Activities(LINQ定义的第5行),但在编译时仍会出现错误:无法将ActividaDeSampleADO转换为Actividades(第8行),也无法将NombreImpleADO转换为NombreImpleADO(第9行)。我应该删除类中的IEnumerable类型吗?@fjleon请尝试我的编辑-我反向获取了内部类型的类型。并且您确实需要
IEnumerable
,因为属性表示集合。仍然存在错误:无法隐式将类型“System.Collections.Generic.IEnumerable”转换为“System.Collections.Generic.IEnumerable”。另外,line 8应该说FechaActividades,而不是Actividades。请参阅我编辑的问题,接收queryActividad的方法应该能够应用where子句,因为shownI必须在我上次编辑之前的注释后重命名接收方法中的属性。现在它确实起作用了。我将用解决方案更新问题。谢谢!ve有趣的是,我会研究这个问题并将其保存在某个地方:D,现在DStanley的解决方案(经过一个小的更改)运行良好。也许我会更改它,我喜欢较短的代码:)@fjleon没关系,我在写上述内容时就知道DStanley的解决方案很好,但既然你说你从LINQ开始,决定努力为你提供一个选择。很高兴你觉得它很有趣,所以付出的努力是值得的:-)干杯。
var queryActividades = listaActividad
    .GroupBy(a => a.Fecha, (fecha, fechaActividades) => Grouping.Create(
        fecha, fechaActividades
            .GroupBy(a => a.Empleado, (nombreEmpleado, actividadesEmpleado) => Grouping.Create(
                nombreEmpleado, actividadesEmpleado))
            .OrderBy(a => a.Key)))
    .OrderBy(a => a.Key);