为什么这个循环再做一次迭代?

时间:2012-01-18 11:33:50

标签: c# entity-framework

存在一个存储在数据库中的角色列表,模型中只有一个角色。实体框架用于填充模型,但我认为这不重要。

代码打击似乎用于迭代这些:

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

但说实话,我无法理解这段代码在做什么。我所知道的是它循环两次而不是一次。任何人都可以澄清它在做什么吗?

3 个答案:

答案 0 :(得分:6)

语句new Role[1]创建一个包含单个元素的数组。该元素为null,除非Role是值类型,我认为它不是。否则,这是通过调用new Role()得到的。

然后,您将null角色与model.Roles中的任何角色连接起来。最终结果是您将null添加到model.Roles中的角色集合中。然后,您将遍历此新集合。

如果model.Roles包含元素

{ role1, role2, role3 }

您的foreach循环将重复

{ null, role1, role2, role3 }

答案 1 :(得分: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(如果Role是引用类型,则为null),然后是model.Roles的所有内容。

答案 2 :(得分:0)

调用Concat会在两个数组上创建一个迭代器。所以2个查询。