这条线不起作用:
public List<T> GetTypes(Type type) => new List<T>().AddRange(
elements.ForEach(x => x.GetType() == type)
);
错误CS0201只能将赋值,调用,递增,递减和新对象表达式用作语句
答案 0 :(得分:4)
因为List.AddRange
返回void,并且空格不能用作返回值。
这应该可以解决这个问题:
new List<T>(elements.Where(x => x.GetType() == type))
或者:
elements.Where(x => x.GetType() == type).ToList()
如果您可以将type
表达为实际类型,例如string
,您甚至可以使用此功能:
elements.OfType<string>().ToList()
答案 1 :(得分:1)
据我所知,您希望按类型过滤通用列表。
您提供的代码段不起作用,原因有三:
[Route("api/test")]
public HttpResponseMessage Get()
{
HttpResponseMessage response = null;
List<table_name> obj = new List<table_name>();
try
{
obj = db.table_name.AsNoTracking().ToList();
response = Request.CreateResponse(HttpStatusCode.OK, obj);
}
catch (Exception ex)
{
response = Request.CreateResponse(HttpStatusCode.NotFound);
}
return response;
}
不会返回列表,只会返回.AddRange(...)
,因此无法在流畅的语法中使用它。如果lambda声明允许void
,你可以通过... => { var lst = new List<T>(); lst.AddRange(elements.Where(x => x.GetType() == type)); return lst; }
解决这个问题,但不幸的是他们不允许这样做。因此,您需要添加另一个传递var
。List<T>
而不提供泛型参数List<T>
。< / LI>
T
不是正确的方法,您需要.ForEach(...)
方法。考虑到上述主题,您可以按如下方式解决(.Where(...)
是必需的,因为扩展方法必须是静态的):
static
它过滤using System;
using System.Collections.Generic;
using System.Linq;
public static class Extensions
{
// Extension method: filters elements by type
public static List<T> GetTypes<T>(this List<T> elements, Type type)
=> elements.Where(x => x.GetType() == type).ToList();
}
public class Program
{
// demonstrates how it is working
public static void Main()
{
var elements = new List<object> {
(int)3, (string)"Hello", (int)5, (string)"World"
};
var filteredList = elements.GetTypes(typeof(System.String));
foreach (var x in filteredList) Console.WriteLine($"{x}");
}
}
列表中的字符串并返回它们,即输出为:
你好 世界
扩展方法的好处是您只需指定2个参数中的一个(如elements
方法中所示)。您也可以将它与2个参数一起使用,或者您可以将其声明为正常函数 - 但在这里我认为使用它有一个优势。
<强> Try it with .NET Fiddle 强>