奇怪的内联数组初始化

时间:2009-08-16 20:09:22

标签: c# arrays

我在不太明白的帖子上发现了这段代码,并且会让某人解释。

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

   ...

C# Array initialization - with non-default value

我对此的看法:

new bool[result.TotalPages + 1]

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

.Select(b => true)

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

.ToArray();

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

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

3 个答案:

答案 0 :(得分:8)

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

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

Enumerable.Repeat(true, result.TotalPages + 1).ToArray();

Select调用根本不依赖于它所选择的值 - 无论输入是什么,它都只返回trueSelect不执行过滤,只是投影。

换句话说:

// 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();

无论如何它效率低下。偶尔不幸的是.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;
}

答案 1 :(得分:5)

  

.Select(b => true)

     

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

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

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

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

return new Enumerable.Range(0,result.TotalPages).Select(b => true).ToArray();

答案 2 :(得分:2)

我相信.Select(b =&gt; true)部分会为数组中的每个元素返回“true”,所以你实际上使用result.TotalPages + 1项获得IEnumerable,然后将它转换为数组。