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# 如何处理列表返回<;匿名类型>;?_C#_Linq_Anonymous Types - Fatal编程技术网

C# 如何处理列表返回<;匿名类型>;?

C# 如何处理列表返回<;匿名类型>;?,c#,linq,anonymous-types,C#,Linq,Anonymous Types,可能重复: 这是我的代码: class B { public int age { get; set; } public string name { get; set; } } class Program { static List<whatshouldIwritehere> GetList() { List<B> list = new List&l

可能重复:

这是我的代码:

 class B
    {
        public int age { get; set; }
        public string name { get; set; }
    }

    class Program
    {
        static List<whatshouldIwritehere> GetList()
        {
            List<B> list = new List<B>() {
                new B(){ age = 10, name = "jaagu" },
                new B(){ age = 20, name = "juggu" },
                new B(){ age = 30, name = "jockey" },
                new B(){ age = 40, name = "jaggu" },
            };

            return (from item in list
                select new { MyAge = item.age, MyName = item.name }).ToList();
        }

        static void Main(string[] args)
        {

            Console.Read();
        }
    }
B类
{
公共整数{get;set;}
公共字符串名称{get;set;}
}
班级计划
{
静态列表GetList()
{
列表=新列表(){
新的B(){age=10,name=“jaagu”},
新的B(){age=20,name=“juggu”},
新的B(){age=30,name=“jockey”},
新的B(){age=40,name=“jaggu”},
};
返回(来自列表中的项目)
选择新建{MyAge=item.age,MyName=item.name}).ToList();
}
静态void Main(字符串[]参数)
{
Console.Read();
}
}
有人能告诉我在函数GetList()的返回类型中应该写什么吗?我知道查询创建了一个匿名类,我想跨函数使用该类。如果我用MyAge和MyName创建一个自定义类,那么很容易在返回类型中给出它。但是,还有别的出路吗?如果这是在同一个函数中,我会使用var关键字。但是我不能在这里使用它。

您可以返回
List
List

如果返回
object
,则除了使用反射,您将无法访问属性。 如果返回dynamic,则可以访问属性,但会丢失编译时检查。(因此,键入in属性名称将导致运行时异常)

编辑: 您需要明确指定ToList函数的类型:

    static List<dynamic> GetList()
    {
        List<B> list = new List<B>() {
            new B(){ age = 10, name = "jaagu" },
            new B(){ age = 20, name = "juggu" },
            new B(){ age = 30, name = "jockey" },
            new B(){ age = 40, name = "jaggu" },
        };

        return (from item in list
                select new { MyAge = item.age, MyName = item.name }).ToList<dynamic>();
    }
静态列表GetList()
{
列表=新列表(){
新的B(){age=10,name=“jaagu”},
新的B(){age=20,name=“juggu”},
新的B(){age=30,name=“jockey”},
新的B(){age=40,name=“jaggu”},
};
返回(来自列表中的项目)
选择新建{MyAge=item.age,MyName=item.name}).ToList();
}

您可以这样做。重用类B,而不是创建匿名类

    static List<B> GetList() 
            { 
....
         return (from item in list 
                    select new B(){age = item.age, name = item.name }).ToList(); 
}
静态列表GetList()
{ 
....
返回(来自列表中的项目)
选择new B(){age=item.age,name=item.name}).ToList();
}

使用
动态
对象

,您可以使用
对象
动态
。为此,请在调用
ToList
之前添加强制转换,以便指定要返回的列表类型:

return (from item in list
        select (dynamic)new { MyAge = item.age, MyName = item.name })
    .ToList();
或:


坦率地说,如果您不想重用
B
,那么您应该定义一个新类型或使用另一个现有类型来保存数据(例如元组)


匿名类型没有名称,并且在编译时没有任何实际类型信息,因此无法从函数返回它们。“修补”返回
动态
对象
列表的方法就是修补。对于这两种选择,它总是次优的。你将不得不求助于反射(直接或间接)。

岩石和坚硬的地方。您想命名一个匿名类型。这不会发生。为什么要返回匿名类型?可能是的重复。请参阅这是对匿名类型的一般限制。因为它们没有命名,所以不能以需要命名的良好类型的方式暴露在任何地方。希望链接的答案能提供一些见解。@everyone:阅读Petar Ivanov的答案,虽然没有编译时支持,但它会很好地工作。但在我的例子中,使用反射或创建“类重载”动态加载比使用反射或创建“类重载”动态加载要好得多,但我在编译过程中遇到了以下错误:“错误1无法将类型“System.Collections.Generic.List”隐式转换为“System.Collections.Generic.List”。我不想使用对象。使用object意味着当我试图访问属性时,我必须使用反射。这两个选项都不太合适。太完美了!谢谢佩塔。您给了我一个完美的答案,而不是像BoltClock那样反复询问我为什么要这样做。@Jaggu我本以为您会感激BoltClock这样的高级代表用户的明智建议。请指定类型:.ToList()B没有MyAge和MyName。只有年龄和姓名。使用年龄和姓名;我已经更新了。你对MyAge和MyName的名字很挑剔吗?只需将其重命名为+1;注:我引用(偷)了你的答案,并提供了一些理由。这个答案不能解决机械问题(如何返回匿名类型?),但它确实为代码示例提供了正确答案。请不要在不解释原因的情况下否决投票。我不仅仅是警察的回答,我还补充了理由。而且,在我发布这篇文章的时候,Peter没有一个有效的例子。
return (from item in list
        select new { MyAge = item.age, MyName = item.name })
    .Cast<dynamic>()
    .ToList();
foreach(B my in GetList())
{
    Console.WriteLine(my.age);
    Console.WriteLine(my.name);
}