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

C# 为什么这个循环还要进行一次迭代?,c#,entity-framework,C#,Entity Framework,有一个存储在数据库中的角色列表,模型中只有一个。实体框架用于填充模型,但我认为它在这里并不重要 代码blow似乎用于迭代以下内容: foreach (var role in (new Role[1]).Concat(model.Roles)) { } 但是说实话,我一辈子都无法理解这个代码在做什么。我所知道的是它循环了两次而不是一次。有人能解释一下它在做什么吗?调用Concat会在两个数组上创建一个迭代器。因此,这两个查询。调用Concat会在两个数组上创建一个迭代器。因此这两个查询。语句新角

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

代码blow似乎用于迭代以下内容:

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

但是说实话,我一辈子都无法理解这个代码在做什么。我所知道的是它循环了两次而不是一次。有人能解释一下它在做什么吗?

调用Concat会在两个数组上创建一个迭代器。因此,这两个查询。

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

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

然后将
null
角色与
model.roles
中的任何角色连接起来。最终结果是将
null
预先添加到
model.roles
中的角色集合中。然后迭代这个新集合

如果
model.Roles
包含元素

{ role1, role2, role3 }
您的
foreach
循环将迭代

{ null, role1, role2, role3 }

语句
newrole[1]
创建一个包含单个元素的数组。该元素是
null
,除非
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;
}
公共静态IEnumerable Concat(此IEnumerable第一,IEnumerable第二)
{
foreach(第一个中的T项)
收益回报项目;
foreach(第二个项目中的T项)
收益率第二;
}

(新角色[1])。Concat(model.Roles)
因此创建一个由一个
角色
新角色[1]
)组成的数组,该数组包含
model.Roles
中的任何角色,然后返回第一个角色和第二个角色的顺序,即一个默认的
角色
(如果
角色
是引用类型,则为null)然后所有的
model.Roles

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;
}
公共静态IEnumerable Concat(此IEnumerable第一,IEnumerable第二)
{
foreach(第一个中的T项)
收益回报项目;
foreach(第二个项目中的T项)
收益率第二;
}

(新角色[1])。Concat(model.Roles)
因此创建一个由一个
角色
新角色[1]
)组成的数组,该数组包含
model.Roles
中的任何角色,然后返回第一个角色和第二个角色的顺序,即一个默认的
角色
(如果
角色
是引用类型,则为null)然后是所有的
model.Roles

为什么要做
新的
?您是否尝试过执行
var temp=new Role[1]).Concat(model.Roles)
并分析
temp
包含的内容?你100%确定
model.Roles
只包含一个对象吗?@ChrisF不幸的是,这不是我的代码,这就是为什么我这么问,因为我不明白它在做什么。是,数据库中只显示一个角色。是的,按照你的建议去做可能是个好主意,你应该想到这一点你为什么要做一个新的
?您是否尝试过执行
var temp=new Role[1]).Concat(model.Roles)
并分析
temp
包含的内容?你100%确定
model.Roles
只包含一个对象吗?@ChrisF不幸的是,这不是我的代码,这就是为什么我这么问,因为我不明白它在做什么。是,数据库中只显示一个角色。是的,按照你的建议去做可能是个好主意,你应该想到这一点谢谢你。我现在明白它在做什么了。我不知道为什么会这样编程,但他的缺陷现在很明显。谢谢。我现在明白它在做什么了。我不知道为什么会这样编程,但他的缺陷现在很明显。谢谢你的回答。我会接受马丁的回答,因为它看起来像是先做的,但我要感谢你的回答。当两个答案对你来说都一样好的时候,这总是一个很好的方法。谢谢你的回答。我会接受马丁的回答,因为它看起来像是先做的,但如果两个答案对你来说都一样好的话,我会给你一个很好的答案。