2009-08-16 51 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,然後將其轉換爲數組。