Linq 如何知道元素的名称?
How does Linq know the name of an element?
我在 Codewars 上解决了一个 C# 初学者 Kata,要求 return 一个只有 4 个字符名称的字符串 []。我使用了一个在 if 语句中填充的列表,然后转换回字符串并 returned.
我的问题是关于下面的最佳实践解决方案,稍后会介绍。
我知道作为参数出现的同一个字符串 [] 会重新填充元素并 returned。 但是程序怎么知道数组的每个元素都被称为“name”,因为它以前从未提到过?
linq 是否知道具有单数名称的变量是复数名称组的元素,这里是“名称”?
感谢您的帮助!
using System;
using System.Collections.Generic;
using System.Linq;
public static class Kata {
public static IEnumerable<string> FriendOrFoe (string[] names) {
return names.Where(name => name.Length == 4);
}
}
I understand that the same string[]
that comes as an argument is refilled with elements and returned.
不,绝对不是。根据输入数组 return 编辑了一个新的字符串序列。输入数组未以任何方式修改或更改。
But how does the program know that each element of the array is called “name”, as it’s never mentioned before?
name
是匿名函数的参数。 name
参数是一个基于上下文的字符串。这可以是 x
或 ASDASDASD
或任何你想要的,但这里我们使用 name
因为我们在每次调用时都有一个来自 names
.[=24 的“名称” =]
因此,
names
是传入函数的字符串数组
-
.Where
return 是当前数组中基于谓词函数的新 IEnumerable<string>
(例如,return 真表示匹配,假表示省略)
- 谓词
name => name.Length == 4
接受一个字符串,如果字符串的长度为 4return,则 return 为真
- 函数中的 return 是
names
中长度正好为 4 个字符的字符串
I understand that the same string[] that comes as an argument is refilled with elements and returned
我将简要地说明这个问题,因为这不是您要问的问题。这不是真的 - 不会发生任何重新填充。原始数组未更改,Where 是一个循环,它在数组上运行并在提交给它的测试对该项目的评估结果为 true 时有选择地从中发出项目。它这样做的方法是通过一个称为 yield return
的特殊结构,这是一种允许代码从方法 return 然后重新输入它并从它之前停止的地方继续进行的方法,而不是而不是从方法的开头重新开始。只有一个数组,并且 looping/testing 不会执行,除非您开始读取 Where 生成的字符串集。如果您想了解更多,请发表评论。
继续前进..
Does linq know that a variable with a singular name is an element of a plural name group, here “names”?
否; IDE 知道变量 name
因为你选择在 Where(
之后调用它
也许将其link 变成您已经知道的东西会有所帮助。编写这段代码是完全可以接受的:
public static class Kata {
public static IEnumerable<string> FriendOrFoe (string[] names) {
return names.Where(IsNameOfLengthFour);
}
static bool IsNameOfLengthFour(string name){
return name.Length == 4;
}
}
其中要求提供某种方法,该方法接受一个字符串并且 return 是一个布尔值。它要求输入是一个字符串,因为它是在 names
上调用的,它是一个字符串数组。如果它是数组中的整数,则传递给 Where 的方法必须采用 int
在 C# 中,通常有一种使事情更紧凑的推动力,因此为了摆脱上面所有的冗长,我们有一种更紧凑的方法体编写形式。让我们减少冗长的版本:
static bool IsNameOfLengthFour(string name){
return name.Length == 4;
}
我们可以剔除 return 类型,因为我们可以从被 return 编辑的类型中猜出。我们也可以摆脱 static,如果我们从另一个 static 内部调用它,则假设它是 static,否则就不是。我们也可以放弃输入类型,因为我们可以从输入的类型中猜测出来。
IsNameOfLengthFour(name){
return name.Length == 4;
}
如果我们有一个只有一行的特殊语法并且必须是自动 returned 的值,我们可以去掉 return
和 {}
因为它只有一行,所以我们不需要隔离多个语句:
IsNameOfLengthFour(name) => name.Length == 4
现在,如果我们要在名称无关紧要的地方使用它,我们实际上也不再需要方法名称了,我们真的不需要 ()
单个参数:
name => name.Length == 4
这足以让编译器能够从中形成一个方法,并将其插入到期望方法采用字符串和 returning 布尔值的东西中。我们已经扔掉了我们人类喜欢的方法的所有绒毛(名称和标识符),只为编译器提供了它需要的原始螺母和螺栓 - 方法的逻辑。当编译器为我们将它们连接在一起时,它将重新创建其余的绒毛;我们将永远无法从我们代码的其他地方调用这个迷你方法,但我们不在乎。我们得到了我们想要的,这是表达 逻辑 :
的一种很好的紧凑方式
Where(n => n.Length==4);
你做得很好,将这个迷你方法的参数称为合理的东西。我看到 x
使用了很多,当 X 是什么 变化时,它变得非常混乱。例如:
names
.Where(name => ...)
.GroupBy(name => ...)
.Select(g => g.First())
.Where(name => ...)
Where
适用于您的名称数组,因此调用委托的参数 name
或 n
是个好主意。 Where 将对其进行过滤,但最终它仍然会发出一组名称字符串,因此在进入 GroupBy 的过程中将其称为 name
仍然是一个好主意。但是 GroupBy 会产生一组 IGrouping,而不是一组字符串,所以来自 GroupBy 的东西不再是名称。在接下来的 Select 中,我将其称为 g
以反映它是一个分组,而不是名称,但我随后取分组中的第一项实际上是一个名称。所以在最后的地方,我回到调用输入参数 name
以反映它原来的样子..
当 LINQ 语句变得更加复杂时,正确命名这些参数确实很有帮助
注意:在这个回答中,我使用了像“list”或“set”这样的词,我指的是一般英语意义上的“数组是 ..”的列表,而不是一种特定的 C# List<xxx>
或 HashSet<xxx>
意义。如果您看到与 C# 类型对齐的小写单词,它们并不是指该特定类型
我在 Codewars 上解决了一个 C# 初学者 Kata,要求 return 一个只有 4 个字符名称的字符串 []。我使用了一个在 if 语句中填充的列表,然后转换回字符串并 returned.
我的问题是关于下面的最佳实践解决方案,稍后会介绍。
我知道作为参数出现的同一个字符串 [] 会重新填充元素并 returned。 但是程序怎么知道数组的每个元素都被称为“name”,因为它以前从未提到过?
linq 是否知道具有单数名称的变量是复数名称组的元素,这里是“名称”?
感谢您的帮助!
using System;
using System.Collections.Generic;
using System.Linq;
public static class Kata {
public static IEnumerable<string> FriendOrFoe (string[] names) {
return names.Where(name => name.Length == 4);
}
}
I understand that the same
string[]
that comes as an argument is refilled with elements and returned.
不,绝对不是。根据输入数组 return 编辑了一个新的字符串序列。输入数组未以任何方式修改或更改。
But how does the program know that each element of the array is called “name”, as it’s never mentioned before?
name
是匿名函数的参数。 name
参数是一个基于上下文的字符串。这可以是 x
或 ASDASDASD
或任何你想要的,但这里我们使用 name
因为我们在每次调用时都有一个来自 names
.[=24 的“名称” =]
因此,
names
是传入函数的字符串数组-
.Where
return 是当前数组中基于谓词函数的新IEnumerable<string>
(例如,return 真表示匹配,假表示省略) - 谓词
name => name.Length == 4
接受一个字符串,如果字符串的长度为 4return,则 return 为真 - 函数中的 return 是
names
中长度正好为 4 个字符的字符串
I understand that the same string[] that comes as an argument is refilled with elements and returned
我将简要地说明这个问题,因为这不是您要问的问题。这不是真的 - 不会发生任何重新填充。原始数组未更改,Where 是一个循环,它在数组上运行并在提交给它的测试对该项目的评估结果为 true 时有选择地从中发出项目。它这样做的方法是通过一个称为 yield return
的特殊结构,这是一种允许代码从方法 return 然后重新输入它并从它之前停止的地方继续进行的方法,而不是而不是从方法的开头重新开始。只有一个数组,并且 looping/testing 不会执行,除非您开始读取 Where 生成的字符串集。如果您想了解更多,请发表评论。
继续前进..
Does linq know that a variable with a singular name is an element of a plural name group, here “names”?
否; IDE 知道变量 name
因为你选择在 Where(
也许将其link 变成您已经知道的东西会有所帮助。编写这段代码是完全可以接受的:
public static class Kata {
public static IEnumerable<string> FriendOrFoe (string[] names) {
return names.Where(IsNameOfLengthFour);
}
static bool IsNameOfLengthFour(string name){
return name.Length == 4;
}
}
其中要求提供某种方法,该方法接受一个字符串并且 return 是一个布尔值。它要求输入是一个字符串,因为它是在 names
上调用的,它是一个字符串数组。如果它是数组中的整数,则传递给 Where 的方法必须采用 int
在 C# 中,通常有一种使事情更紧凑的推动力,因此为了摆脱上面所有的冗长,我们有一种更紧凑的方法体编写形式。让我们减少冗长的版本:
static bool IsNameOfLengthFour(string name){
return name.Length == 4;
}
我们可以剔除 return 类型,因为我们可以从被 return 编辑的类型中猜出。我们也可以摆脱 static,如果我们从另一个 static 内部调用它,则假设它是 static,否则就不是。我们也可以放弃输入类型,因为我们可以从输入的类型中猜测出来。
IsNameOfLengthFour(name){
return name.Length == 4;
}
如果我们有一个只有一行的特殊语法并且必须是自动 returned 的值,我们可以去掉 return
和 {}
因为它只有一行,所以我们不需要隔离多个语句:
IsNameOfLengthFour(name) => name.Length == 4
现在,如果我们要在名称无关紧要的地方使用它,我们实际上也不再需要方法名称了,我们真的不需要 ()
单个参数:
name => name.Length == 4
这足以让编译器能够从中形成一个方法,并将其插入到期望方法采用字符串和 returning 布尔值的东西中。我们已经扔掉了我们人类喜欢的方法的所有绒毛(名称和标识符),只为编译器提供了它需要的原始螺母和螺栓 - 方法的逻辑。当编译器为我们将它们连接在一起时,它将重新创建其余的绒毛;我们将永远无法从我们代码的其他地方调用这个迷你方法,但我们不在乎。我们得到了我们想要的,这是表达 逻辑 :
的一种很好的紧凑方式Where(n => n.Length==4);
你做得很好,将这个迷你方法的参数称为合理的东西。我看到 x
使用了很多,当 X 是什么 变化时,它变得非常混乱。例如:
names
.Where(name => ...)
.GroupBy(name => ...)
.Select(g => g.First())
.Where(name => ...)
Where
适用于您的名称数组,因此调用委托的参数 name
或 n
是个好主意。 Where 将对其进行过滤,但最终它仍然会发出一组名称字符串,因此在进入 GroupBy 的过程中将其称为 name
仍然是一个好主意。但是 GroupBy 会产生一组 IGrouping,而不是一组字符串,所以来自 GroupBy 的东西不再是名称。在接下来的 Select 中,我将其称为 g
以反映它是一个分组,而不是名称,但我随后取分组中的第一项实际上是一个名称。所以在最后的地方,我回到调用输入参数 name
以反映它原来的样子..
当 LINQ 语句变得更加复杂时,正确命名这些参数确实很有帮助
注意:在这个回答中,我使用了像“list”或“set”这样的词,我指的是一般英语意义上的“数组是 ..”的列表,而不是一种特定的 C# List<xxx>
或 HashSet<xxx>
意义。如果您看到与 C# 类型对齐的小写单词,它们并不是指该特定类型