2012-01-18 83 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