2009-08-16 71 views
1

我在另一个帖子上发现了这个代码片断,我不太明白,并且会解释某人。奇怪的内联数组初始化

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与长度的数组等于总页数的,缺省值是在所有这些假的。

.Select(b => true) 

此使用LINQ查询只返回为真品,也就是他们没有

.ToArray(); 

LINQ返回的IEnumerable类的东西,所以它需要回到一个新的阵列中,长度为0,因为首先没有选择。

我认为这就是它在做什么,但它没有任何意义。

+0

一个人有时会因单词'Select'而感到困惑,因为它听起来像:**“过滤器”**来源(不过那叫做“Where”);实际上这意味着:**“项目”**的来源。 – 2014-11-13 19:59:38

回答

8

(编辑:哎呀,误读后(除非它没有我注意到编辑))

不,这不是它做什么。其结果是有效:

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

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

反正它的效率不高。这是偶然不幸的是,.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; 
} 
+0

这个答案的第一行有点误导......它实际上并没有做OP所描述的内容。选择不执行任何类型的过滤器,它对数组中的每个项目返回true。 – 2009-08-16 20:20:42

+0

@ spoon16:是的,因此我的编辑不久之前您的评论:) – 2009-08-16 20:25:34

+0

它看起来像你的意思是使最后的方法是一个通用的。 – 2014-11-13 19:55:02

5

.Select(b => true)

此使用LINQ查询只返回为真品,也就是他们没有

不,这意味着对于每个项目,它都会返回true。它没有做任何测试的数组项的值

此代码只是创建设置为true

我更喜欢这种形式(无中间阵列)的所有元素的数组:

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

'Enumerable.Repeat'是做这件事的一个更加描述性的方式,IMO。 – 2009-08-16 20:18:22

+0

是的,你是对的,我忘记了'重复'方法...... – 2009-08-16 23:12:16

2

我相信.Select(b => true)部分为数组中的每个元素返回“true”,因此您实际上通过result.TotalPages + 1项获取IEnumerable,然后将其转换为数组。