Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.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#lambda:为什么不';这行代码行不行?_C#_Lambda - Fatal编程技术网

C#lambda:为什么不';这行代码行不行?

C#lambda:为什么不';这行代码行不行?,c#,lambda,C#,Lambda,这行不行: public List<T> GetTypes(Type type) => new List<T>().AddRange( elements.ForEach(x => x.GetType() == type) ); public List GetTypes(Type)=>new List().

这行不行:

public List<T> GetTypes(Type type) => new List<T>().AddRange(
                                        elements.ForEach(x => x.GetType() == type)
                                      );
public List GetTypes(Type)=>new List().AddRange(
elements.ForEach(x=>x.GetType()==type)
);

错误CS0201只有赋值、调用、递增、递减和新对象表达式可以用作语句,因为
List.AddRange
返回void,而void不能用作返回值

不过,这应该可以做到:

new List<T>(elements.Where(x => x.GetType() == type))
如果您可以将
类型
表示为实际类型,比如
字符串
,那么您甚至可以使用:

elements.OfType<string>().ToList()
elements.OfType().ToList()

因为
List.AddRange
返回void,并且void不能用作返回值

不过,这应该可以做到:

new List<T>(elements.Where(x => x.GetType() == type))
如果您可以将
类型
表示为实际类型,比如
字符串
,那么您甚至可以使用:

elements.OfType<string>().ToList()
elements.OfType().ToList()

我知道您希望按类型筛选通用列表
由于以下三个原因,您提供的代码段不起作用:

  • .AddRange(…)
    不返回列表,而是
    void
    ,因此不能在流畅的语法中使用。您可以通过
    ..=>{var lst=new List();lst.AddRange(elements.Where(x=>x.GetType()==type));返回lst;}
    
    如果lambda声明允许
    var
    ,但不幸的是,它们不允许。因此,您需要添加另一个传递
    列表的参数
  • 代码段使用泛型的方式存在一个问题:无论是在类级别还是在函数级别,都不能在不提供泛型参数的情况下声明
    列表
  • .ForEach(…)
    在这里不是正确的方法,您需要一个
    .Where(…)
    方法
  • 考虑到上述主题,您可以按如下方式解决它(
    static
    是必需的,因为扩展方法必须是静态的):

    使用系统;
    使用System.Collections.Generic;
    使用System.Linq;
    公共静态类扩展
    {
    //扩展方法:按类型筛选元素
    公共静态列表GetTypes(此列表元素,类型)
    =>elements.Where(x=>x.GetType()==type.ToList();
    }
    公共课程
    {
    //演示它是如何工作的
    公共静态void Main()
    {
    var元素=新列表{
    (int)3,(string)“Hello”,(int)5,(string)“World”
    };
    var filteredList=elements.GetTypes(typeof(System.String));
    foreach(filteredList中的varx)Console.WriteLine($“{x}”);
    }
    }
    
    它从
    元素
    列表中过滤字符串并返回它们,即输出为:

    你好
    世界

    扩展方法的好处是,您只需指定两个参数中的一个(如
    Main
    方法所示)。您也可以将它与2个参数一起使用,或者您也可以将它声明为一个普通函数——但在这里,我认为使用它有一个优势


    我知道您希望按类型筛选通用列表
    由于以下三个原因,您提供的代码段不起作用:

  • .AddRange(…)
    不返回列表,而是
    void
    ,因此不能在流畅的语法中使用。您可以通过
    ..=>{var lst=new List();lst.AddRange(elements.Where(x=>x.GetType()==type));返回lst;}
    
    如果lambda声明允许
    var
    ,但不幸的是,它们不允许。因此,您需要添加另一个传递
    列表的参数
  • 代码段使用泛型的方式存在一个问题:无论是在类级别还是在函数级别,都不能在不提供泛型参数的情况下声明
    列表
  • .ForEach(…)
    在这里不是正确的方法,您需要一个
    .Where(…)
    方法
  • 考虑到上述主题,您可以按如下方式解决它(
    static
    是必需的,因为扩展方法必须是静态的):

    使用系统;
    使用System.Collections.Generic;
    使用System.Linq;
    公共静态类扩展
    {
    //扩展方法:按类型筛选元素
    公共静态列表GetTypes(此列表元素,类型)
    =>elements.Where(x=>x.GetType()==type.ToList();
    }
    公共课程
    {
    //演示它是如何工作的
    公共静态void Main()
    {
    var元素=新列表{
    (int)3,(string)“Hello”,(int)5,(string)“World”
    };
    var filteredList=elements.GetTypes(typeof(System.String));
    foreach(filteredList中的varx)Console.WriteLine($“{x}”);
    }
    }
    
    它从
    元素
    列表中过滤字符串并返回它们,即输出为:

    你好
    世界

    扩展方法的好处是,您只需指定两个参数中的一个(如
    Main
    方法所示)。您也可以将它与2个参数一起使用,或者您也可以将它声明为一个普通函数——但在这里,我认为使用它有一个优势


    元素。ForEach(x=>x.GetType()==type)不返回列表,您是说在哪里?
    AddRange
    不返回值。你的意思是
    元素。其中(x=>x.GetType()==type)。ToList()
    ?使用
    列表(IEnumerable)构造函数而不是无参数构造函数。或者使用LINQ查询,后跟一个
    ToList()`@Emily,检查解决方案是否适合您…元素。ForEach(x=>x.GetType()==type)不返回列表,您是说在哪里?
    AddRange
    不返回值。你的意思是
    元素。其中(x=>x.GetType()==type)。ToList()
    ?使用
    列表(IEnumerable)构造函数而不是无参数构造函数。或者使用LIN