2012-01-18 3 views
1

データベースに格納されているロールのリストがあり、そのうちの1つだけがモデルに存在します。 Entity Frameworkを使用してモデルを生成しますが、ここでは重要ではないと思います。なぜこのループはもう一度繰り返しますか?

コードブローはこれらを反復するために使用されているようだ:

foreach (var role in (new Role[1]).Concat(model.Roles)) 
{ 
} 

しかし、あなたと正直に言うと、私はこのコードが何をしているか、私の人生のために理解することはできません。私が知っているのは、1回ではなく2回繰り返しているということだけです。誰がそれをやっているのか明確にすることはできますか?

+1

なぜ新しいものをやっていますか?あなたは 'var temp = new Role [1])を実行しようとしましたか?Concat(model.Roles)'と 'temp 'に含まれているものを分析しましたか? 'model.Roles'には1つのオブジェクトだけが含まれていますか? – ChrisF

+0

@ChrisF残念ながら私のコードではないので、私はそれが何をしているのか分からないので、私は尋ねています。はい、データベースに表示されるロールは1つだけです。はい、あなたが示唆したことをすることは、おそらくそれを考えるべき良い考えです! :-) – Firedragon

答えて

6

ステートメントnew Role[1]は、単一の要素を含む配列を作成します。その要素はnullです。Roleが値ではないと思わない限り、この要素はありません。それ以外の場合は、new Role()と呼んでください。

次に、nullロールと、model.Rolesにあるロールとを連結します。最終的にはnullをロールのコレクションにmodel.Rolesの前に追加します。その後、この新しいコレクションを繰り返します。

model.Rolesは要素

{ role1, role2, role3 } 

が含まれている場合は、あなたのforeachループが

{ null, role1, role2, role3 } 
+0

ありがとうございます。私は今何をしているのか理解できます。私はそれがなぜそんなにプログラムされたのか分かりませんが、今は欠陥が明らかです。 – Firedragon

0

Concatを呼び出すと、両方の配列のイテレータが作成されます。 2つのクエリ。

2

Concat 2つの配列を連結反復します。以下のようなそれかなり作品:

public static IEnumerable<T> Concat<T>(this IEnumerable<T> first, IEnumerable<T> second) 
{ 
    foreach(T item in first) 
    yield return item; 
    foreach(T item in second) 
    yield return second; 
} 

(new Role[1]).Concat(model.Roles)したがってmodel.Rolesにあるものは何でも、1 Rolenew Role[1])の配列を作成し、第二に続く最初のシーケンスを返し、それは場合は、1つのデフォルトRole(nullでありますRoleは参考タイプです)、次にすべてmodel.Rolesです。

+0

答えをありがとう。私はマーティンの答えを受け入れるでしょう。最初にやったように見えますが、偉大な答えのためにあなたを+1しました。 – Firedragon

+0

2つの答えが同じように見えるときは常に良いアプローチです。 –

関連する問題