奇怪的内联数组初始化

Dan*_*ell 1 c# arrays

我发现这个代码片段在一个我不太了解的不同帖子上,并且会让某人解释.

private bool[] GetPageNumbersToLink(IPagedResult result)
{
   if (result.TotalPages <= 9)
      return new bool[result.TotalPages + 1].Select(b => true).ToArray();

   ...
Run Code Online (Sandbox Code Playgroud)

C#数组初始化 - 使用非默认值

我对此的看法:

new bool[result.TotalPages + 1]
Run Code Online (Sandbox Code Playgroud)

这会创建一个bool数组,其长度等于totalpages的长度,默认值为false.

.Select(b => true)
Run Code Online (Sandbox Code Playgroud)

这使用linq查询只返回true的项,即没有

.ToArray();
Run Code Online (Sandbox Code Playgroud)

linq返回IEnumerable或其他东西,因此需要返回一个长度为0的新数组,因为首先没有选择任何数组.

我认为这就是它正在做的事情,但它没有任何意义.

Jon*_*eet 8

(编辑:哎呀,误读了帖子(除非在没有注意的情况下进行编辑).)

不,这不是它正在做的事情.结果是有效的:

Enumerable.Repeat(true, result.TotalPages + 1).ToArray();
Run Code Online (Sandbox Code Playgroud)

Select调用不取决于它的选择,在所有的价值-它只是返回true无论输入.Select不执行过滤,只是投影.

换一种说法:

// Array filled with (result.TotalPages + 1) x false
new bool[result.TotalPages + 1]

// Sequence of length (result.TotalPages + 1) x true
.Select(b => true)

// Array filled with (result.TotalPages + 1) x true
.ToArray();
Run Code Online (Sandbox Code Playgroud)

无论如何它效率低下.偶尔不幸的是.NET没有提供类似的东西:

public static T[] CreateFilledArray<T>(T value, int size)
{
    T[] ret = new T[size];
    for (int i=0; i < size; i++)
    {
        ret[i] = value;
    }
    return ret;
}
Run Code Online (Sandbox Code Playgroud)


Tho*_*que 5

.Select(b => true)

这使用linq查询只返回true的项,即没有

不,这意味着对于每个项目,它返回true.它不对数组项的值进行任何测试

此代码只创建一个所有项都设置为true的数组

我更喜欢这种形式(没有中间数组):

return new Enumerable.Range(0,result.TotalPages).Select(b => true).ToArray();
Run Code Online (Sandbox Code Playgroud)