为什么这个循环还要进行一次迭代
本文关键字:迭代 一次 循环 为什么 | 更新日期: 2023-09-27 18:20:44
数据库中存储了一个角色列表,而模型中只有其中一个。实体框架用于填充模型,但我认为它在这里并不重要。
代码破解似乎被用来迭代这些:
foreach (var role in (new Role[1]).Concat(model.Roles))
{
}
但老实说,我一辈子都无法理解这个代码在做什么。我只知道它循环两次而不是一次。有人能澄清它在做什么吗?
new Role[1]
创建一个包含单个元素的数组。那个元素是null
,除非Role
是一个值类型,而我认为它不是。否则,它就是您通过调用new Role()
得到的。
然后将null
角色与model.Roles
中的任何角色连接起来。最终结果是将null
预先添加到model.Roles
中的角色集合中。然后对这个新集合进行迭代。
如果model.Roles
包含元素
{ role1, role2, role3 }
您的foreach
循环将迭代
{ null, role1, role2, role3 }
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
。
调用Concat会在两个数组上创建一个迭代器。所以这2个查询。