C#lambda:为什么这行代码不起作用?

时间:2017-02-03 10:03:58

标签: c# lambda

这条线不起作用:

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

错误CS0201只能将赋值,调用,递增,递减和新对象表达式用作语句

2 个答案:

答案 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)

据我所知,您希望按类型过滤通用列表。
您提供的代码段不起作用,原因有三:

  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
  2. 的参数
  3. 代码段使用泛型的方式存在问题:您无法在类级别或功能级别上声明List<T>而不提供泛型参数List<T>。< / LI>
  4. T不是正确的方法,您需要.ForEach(...)方法。
  5. 考虑到上述主题,您可以按如下方式解决(.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