存在一个存储在数据库中的角色列表,模型中只有一个角色。实体框架用于填充模型,但我认为这不重要。
代码打击似乎用于迭代这些:
foreach (var role in (new Role[1]).Concat(model.Roles))
{
}
但说实话,我无法理解这段代码在做什么。我所知道的是它循环两次而不是一次。任何人都可以澄清它在做什么吗?
答案 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)
会创建一个Role
(new Role[1]
)的数组,无论model.Roles
中是什么,然后返回第一个的序列,然后是第二个,即一个默认Role
(如果Role
是引用类型,则为null),然后是model.Roles
的所有内容。
答案 2 :(得分:0)
调用Concat会在两个数组上创建一个迭代器。所以2个查询。