为什么这个循环还要进行一次迭代

本文关键字:迭代 一次 循环 为什么 | 更新日期: 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)创建一个Rolenew Role[1])的数组,无论model.Roles中有什么,然后返回第一个后面跟着第二个的序列,即一个默认Role(如果Role是引用类型,则为null),然后返回所有model.Roles

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