C# 中 JavaScript Array.from 的等价物是什么(不带 while/for)?

Mic*_*lix 2 c#

经过几年的 Node.js 编程,我已经习惯了 JS,我想知道如何避免C# 中的while循环,通过使用更“类似地图”的方法(如 C# 中的 AddRange)来添加数组中的项目可枚举)。

例如,如果我想要一个 JavaScript 中包含 10 个元素的数组,每个元素都有一个每次递增的属性,我会这样做:

const cells = Array.from({ length:10 }, (_, i) => { 'number': i });
// gives cells = [{number: 0}, {number: 1}, ... until 9]
Run Code Online (Sandbox Code Playgroud)

如何在没有whileorfor循环的 C# 中做到这一点?

int itemWantedCount = 10;
int i = 0;
while(cells.Count < itemWantedCount)
{
   cells.Add(new MyObject(i++));
}
Run Code Online (Sandbox Code Playgroud)

我想找到一种使用 cells.AddRange 的方法,而不使用 for/while ,如果可能的话。

Hei*_*nzi 6

您可以在 C# 中使用LINQ进行函数式列表处理。例子:

// We don't need Select in this toy example, but this is where
// you would put your "map" operation.
var cells = Enumerable.Range(0, 10).Select(i => i).ToArray();
            
// prints 0123456789
foreach (var c in cells)
    Console.Write(c);     
Run Code Online (Sandbox Code Playgroud)

解释:

  • Enumerable.Range(start, count)枚举我们的号码(懒惰地 - 直到稍后调用才发生任何事情ToArray())。
  • Select是“地图”——你已经熟悉它了。在您的示例中,您将替换i => ii => new MyObject(i).
  • ToArray():具体化延迟创建的枚举。由于数组在 C# 中是固定大小的,因此更惯用的替代方案是ToList().