2009-08-16 19 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] 

これはデフォルトの値はそれらのすべてに偽であること、totalpagesのそれと同じ長さのboolsの配列を作成します。

.Select(b => true) 

これに該当する項目のみを返すためにLINQクエリを使用して、それはの、戻って新しい配列に行く必要ので、それらのすなわちどれ

.ToArray(); 

LINQは、IEnumerableをか何かを返しません最初は長さ0を選択しなかった。

私はそれが何をしているのだと思いますが、それは意味をなさない。

+0

「選択」という言葉は、次のように混同されることがあります。**「フィルタ」**ソース(ただし、「Where」と呼ばれます)。実際にはそれは次のことを意味します:** "プロジェクト" **ソース。 –

答えて

8

(EDIT:。それは私が気付かずに編集された場合を除きおっと、)(ポストを読み違える)

いいえ、それはそれはやっているものではありません。結果は事実です:

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

とにかくそれは非効率的です。

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が説明していることではありません。Selectはどのタイプのフィルタも実行していないので、配列内の各項目に対してtrueを返します。 –

+0

@ spoon16:だから、あなたのコメントの直前に私の編集:) –

+0

それはあなたがその最後のメソッドを一般的なものにすることを意味しているようです。 –

5

.Select(b => true)

が、これはすなわち真であるアイテムのみ、それらのどれも

を返すためにLINQクエリを使用しています。それは、.NETのようなものを提供しないことを時折残念です

いいえ、各項目についてtrueを返すことを意味します。

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

'Enumerable.Repeat'はこれを行うためのよりわかりやすい方法です、IMO。 –

+0

はい、あなたは正しいです、私は 'Repeat'メソッドについて忘れていました... –

2
:それは

このコードは、ちょうど私が(中間の配列)このフォームを好むない真

に設定されているすべてのアイテムを持つ配列を作成し、配列項目の値に任意のテストを行いません。

私は、.Select(b => true)部分が配列内のすべての要素に対して "true"を返すので、実際にresult.TotalPages + 1項目でIEnumerableを取得してから配列に変換されると思います。