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