2012-01-18 81 views
1

存在一個存儲在數據庫中的角色列表,模型中只有其中一個角色。實體框架用於填充模型,但我認爲這不重要。爲什麼這個循環再做一次迭代?

代碼的打擊似乎是用來遍歷這些:

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

但說實話跟你我無法理解我的生活這是什麼代碼正在做什麼。我所知道的是它循環兩次而不是一次。任何人都可以澄清它在做什麼?

+1

你爲什麼要做一個'new'?你嘗試做'var temp = new Role [1]).Concat(model.Roles)'並分析'temp'包含什麼?你是否100%確定'model.Roles'只包含一個對象? – ChrisF 2012-01-18 11:36:35

+0

@ChrisF這不是我的代碼不幸,這就是爲什麼我問,因爲我只是不明白它在做什麼。是的,數據庫中只顯示一個角色。是的,做你的建議可能是一個好主意,應該已經想到了! :-) – Firedragon 2012-01-18 11:39:07

回答

6

語句new Role[1]創建一個包含單個元素的數組。該元素是null,除非Role是一個值類型,我認爲它不是。否則,您可以致電new Role()

然後,您將null角色與model.Roles中的任何角色連接起來。最終結果是,您在model.Roles之前預先加入null以收集角色。然後你迭代這個新的集合。

如果model.Roles包含的元素

{ role1, role2, role3 } 

foreach循環將迭代

{ null, role1, role2, role3 } 
+0

謝謝你。我現在可以瞭解它在做什麼。我不知道爲什麼這樣編程,但他的缺陷現在是明顯的。 – Firedragon 2012-01-18 11:44:46

0

調用Concat在兩個數組上創建一個迭代器。所以2個查詢。

2

Concat連接兩個序列。它非常作品,如:

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)因此創建一個Rolenew Role[1])的陣列,無論是在model.Roles,然後返回第一個接着是第二序列,即一個默認Role(NULL,如果Role是一個參考類型),然後全部爲model.Roles

+0

感謝您的回答。我會接受Martin的答案,因爲它看起來像是第一次做的,但已經爲你的+1了很好的答案 – Firedragon 2012-01-18 11:45:35

+0

當兩個答案看起來同樣好時,總是一個好方法。 – 2012-01-18 11:47:19