如何使用省略了 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.
假设我有一个列表,我想检查成员是否都等于 "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.