提问者:小点点

Linq如何知道元素的名称?


我已经解决了一个C#初学者卡塔在代码战,要求返回一个字符串[]只有4个字符的名称。我使用了一个列表,该列表填充在if语句中,然后转换回字符串并返回。

我知道作为参数的字符串[]被元素填充并返回。但是程序如何知道数组的每个元素都被称为“名称”,因为它以前从未提到过?

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);
  }
}

共2个答案

匿名用户

我知道作为参数的同一字符串[]被元素重新填充并返回。

不,绝对不是。基于输入数组返回一个全新的数组。不以任何方式修改或更改输入数组。

但是程序如何知道数组的每个元素都被称为“名称”,因为它以前从未提到过?

name是匿名函数的参数。name参数是基于上下文的字符串。这可以是xASDASDASD或您想要的任何东西,但这里我们使用name,因为我们在每次调用中都有一个来自name的“name”。

因此

  • name是传递给函数的字符串数组
  • the.其中基于谓词函数从当前数组返回一个新数组(例如,匹配返回true,忽略返回false)
  • 谓语name=

匿名用户

linq是否知道一个具有单数名称的变量是复数名称组的一个元素,这里是“名称”?

不IDE知道变量name,因为在Where(

也许把它和你已经知道的东西联系起来会有帮助。编写以下代码是完全可以接受的:

public static class Kata {
  public static IEnumerable<string> FriendOrFoe (string[] names) {
    return names.Where(IsNameOfLengthFour);
  }

  static bool IsNameOfLengthFour(string name){
    return name.Length == 4;
  }
}

其中要求提供某种方法,该方法接受字符串并返回布尔值。它要求输入是一个字符串,因为它被调用的name是一个字符串数组。如果它是数组中的int,则传递到where的方法必须接受一个int

在C#中,经常会有一种让事情变得更紧凑的推动力,所以为了摆脱上面所有的冗长,我们有一种更紧凑的写作方法主体形式。让我们减少我们冗长的版本:

static bool IsNameOfLengthFour(string name){
  return name.Length == 4;
}

我们可以丢弃返回类型,因为我们可以从返回的类型中猜出。我们也可以去掉static,假设static是从另一个static内部调用的,或者假设不是。我们也可以抛弃输入类型,因为我们可以从输入的类型中猜出。

IsNameOfLengthFour(name){
  return name.Length == 4;
}

如果我们有一个特殊的syntx,它只有一行,并且必须是自动返回的值,那么我们可以去掉return,以及{},因为它只有一行,所以我们不需要避开多个语句:

IsNameOfLengthFour(name) => name.Length == 4

现在,如果我们要在一个名称不相关的地方使用它,我们实际上也不再需要方法名称,而且我们也不需要对单个参数使用()

name => name.Length == 4

对于编译器来说,这就足够了,可以用它来构造一个方法,并将它插入到一个需要一个字符串并返回布尔值的方法中

Where(n => n.Length==4);

你做得很好,称这个迷你方法的论点是合理的。我看到x被大量使用,当x的内容发生变化时,它会变得非常混乱。。例如:

names
  .Where(name => ...)
  .GroupBy(name => ...)
  .Select(g => g.First())
  .Where(name => ...)

其中适用于名称数组,因此将参数调用到代理namen是一个好主意。Where将对其进行过滤,但最终它仍然会发出一组字符串,这些字符串是名称,因此在进入GroupBy的过程中调用它仍然是一个好主意。。但是GroupBy生成的是一组i分组,而不是一组字符串,因此GroupBy的名称不再是名称。。在下一个选择中,我将其称为g,以反映它是一个分组,而不是一个名称,但随后我将取分组中的第一项,实际上是一个名称。。因此,在最后一部分中,我返回到调用输入参数name,以反映它的原貌。。

当LINQ语句变得更加复杂时,正确命名这些参数确实有帮助