如何使用省略了 lambda 的非常短的 linq 将方法应用于所有列表成员?

How apply a method to all list members using very short linq with lambda omitted?

假设我有一个列表,我想检查成员是否都等于 "some string":

myList.All(v => v.Equals("some string"))

我认为这会做同样的事情(或者会吗?!):

myList.All("some string".Equals)

但是如果我想使用自己的方法而不是 .Equals 怎么办?

public bool LessThan16Char(string input)
{
    return (input.Length < 16);
}

如何用 LessThan16Char 替换 .Equals


如果方法有第二个参数(例如lessthan(string Input, Int lessThanVal))怎么办

如果网络上有任何描述此类内容的文章,我也将不胜感激。谢谢。

直接调用即可:

public Class1()
{
    var myList = new List<string>();
    var foo = myList.All(LessThan16Char);
}

如果您需要第二个参数,那么您将需要 lambda:

public Class1()
{
    var myList = new List<string>();
    var foo = myList.All(l=>LessThan16Char(l,16));
}


public bool LessThan16Char(string input, int max)
{
    return (input.Length < max);
}

可以写LessThan16Char作为字符串扩展方法:

    public static bool LessThan16Char(this string input)
    {
        return (input.Length < 16);
    }

并在您的 lambda 表达式中使用它:

    myList.All(x => x.LessThan16Char());

正如我在您可以使用 myList.All(LessThan16Char) 之前评论的那样。

请记住 myList.All(LessThan16Char) 不同于 myList.All(x => LessThan16Char(x))

第二个创建了一个额外的间接寻址。编译器将 x => LessThan16Char(x) 转换为获取字符串作为输入并为其调用 LessThan16Char 的方法。

可以看到生成的不同的IL。

1。 myList.All(LessThan16Char)

IL_0008:  ldarg.0     
IL_0009:  ldftn       UserQuery.LessThan16Char
IL_000F:  newobj      System.Func<System.String,System.Boolean>..ctor
IL_0014:  call        System.Linq.Enumerable.All

2。 myList.All(x=> LessThan16Char(x))

IL_001B:  ldarg.0     
IL_001C:  ldftn       UserQuery.<Main>b__0_0
IL_0022:  newobj      System.Func<System.String,System.Boolean>..ctor
IL_0027:  call        System.Linq.Enumerable.All

和额外生成的方法

<Main>b__0_0:
IL_0000:  ldarg.0     
IL_0001:  ldarg.1     
IL_0002:  call        UserQuery.LessThan16Char
IL_0007:  ret   

通常它们都做同样的事情,但在某些情况下它们可能不同。例如,当您想知道包含传递给 LINQ 查询的方法的 class,并且您传递的是 int.Parse 而不是 x => int.Parse(x)。第二个是 class 内部的方法,但第一个是框架 classes.