Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在foreach和select表达式中使用Null合并运算符 foreach(Model.PublishedSong.RelatedSongs.Select((value,i)=>new{value,i})中的var项)?Enumerable.Empty()) { }_C#_Linq_Null_Null Coalescing Operator - Fatal编程技术网

C# 在foreach和select表达式中使用Null合并运算符 foreach(Model.PublishedSong.RelatedSongs.Select((value,i)=>new{value,i})中的var项)?Enumerable.Empty()) { }

C# 在foreach和select表达式中使用Null合并运算符 foreach(Model.PublishedSong.RelatedSongs.Select((value,i)=>new{value,i})中的var项)?Enumerable.Empty()) { },c#,linq,null,null-coalescing-operator,C#,Linq,Null,Null Coalescing Operator,相关歌曲可能是空的,也可能不是空的,这里有没有办法使用空合并操作符?我仍然收到错误消息: 值不能为空 像这样 [编辑:删除简化] foreach (var item in Model.PublishedSong.RelatedSongs.Select((value, i) => new { value, i }) ?? Enumerable.Empty <dynamic>()) { } Model.PublishedSong .SelectMany(x=> (x.Relat

相关歌曲可能是空的,也可能不是空的,这里有没有办法使用空合并操作符?我仍然收到错误消息:

值不能为空

像这样

[编辑:删除简化]

foreach (var item in Model.PublishedSong.RelatedSongs.Select((value, i) => new { value, i }) ?? Enumerable.Empty <dynamic>())
{

}
Model.PublishedSong
.SelectMany(x=>
(x.RelatedSongs??可枚举.Empty())
.选择((x,i)=>new{Value=x,Index=i));
它的计算结果是一个而不是两个枚举。

像这样

[编辑:删除简化]

foreach (var item in Model.PublishedSong.RelatedSongs.Select((value, i) => new { value, i }) ?? Enumerable.Empty <dynamic>())
{

}
Model.PublishedSong
.SelectMany(x=>
(x.RelatedSongs??可枚举.Empty())
.选择((x,i)=>new{Value=x,Index=i));

它的计算结果是单个可枚举项,而不是两个。

如果
RelatedSongs
为null,则对其调用
Select
将抛出一个NullReferenceException,因为null合并运算符只有在解析左侧后才进行计算。而且由于解析左侧会导致异常,因此它不会对您产生任何影响好

如果您使用的是C#6.0,则可以使用Null传播操作符-
?。
-仅当
RelatedSongs
不为Null时调用Select,否则使用Null合并操作符:

Model.PublishedSong
   .SelectMany(x=>
      (x.RelatedSongs??Enumerable.Empty<Song>())
         .Select((x,i) => new {Value = x, Index = i));
//如果Relatedsongs为null,则返回null,否则调用Select。
foreach(Model.PublishedSong.RelatedSongs?中的var项。选择((值,i)=>new{value,i})
??可枚举。空())
{
}
如果您使用的是C#5或更早版本,则必须手动检查null:

// This will return null if Relatedsongs is null, or call Select otherwise.
foreach (var item in Model.PublishedSong.RelatedSongs?.Select((value, i) => new { value, i })  
                             ?? Enumerable.Empty <dynamic>())
{
}
foreach(Model.PublishedSong.RelatedSongs!中的变量项)=null
?Model.PublishedSong.RelatedSongs.Select((值,i)=>new{value,i})
:Enumerable.Empty())
{
}

如果
RelatedSongs
为null,则对其调用
Select
将引发NullReferenceException,因为只有在解析左侧后才会计算null合并运算符。而且由于解析左侧会导致异常,因此对您没有任何好处

如果您使用的是C#6.0,则可以使用Null传播操作符-
?。
-仅当
RelatedSongs
不为Null时调用Select,否则使用Null合并操作符:

Model.PublishedSong
   .SelectMany(x=>
      (x.RelatedSongs??Enumerable.Empty<Song>())
         .Select((x,i) => new {Value = x, Index = i));
//如果Relatedsongs为null,则返回null,否则调用Select。
foreach(Model.PublishedSong.RelatedSongs?中的var项。选择((值,i)=>new{value,i})
??可枚举。空())
{
}
如果您使用的是C#5或更早版本,则必须手动检查null:

// This will return null if Relatedsongs is null, or call Select otherwise.
foreach (var item in Model.PublishedSong.RelatedSongs?.Select((value, i) => new { value, i })  
                             ?? Enumerable.Empty <dynamic>())
{
}
foreach(Model.PublishedSong.RelatedSongs!中的变量项)=null
?Model.PublishedSong.RelatedSongs.Select((值,i)=>new{value,i})
:Enumerable.Empty())
{
}

我认为@juharr的评论很好-如果在循环之前执行null检查,它可能更可读。但是,如果您真的想使用null合并运算符,这将实现以下目的:

foreach (var item in Model.PublishedSong.RelatedSongs != null 
                             ? Model.PublishedSong.RelatedSongs.Select((value, i) => new { value, i }) 
                             : Enumerable.Empty <dynamic>())
{
}
foreach(Model.PublishedSong.RelatedSongs??Enumerable.Empty())中的var项。选择((value,i)=>new{value,i}))
{
}

您必须在尝试迭代
相关歌曲之前执行空检查。在您问题中的示例中,您是在尝试迭代之后执行空检查的,因此出现了异常。

我认为@juharr的注释很好-如果在循环之前执行空检查,它可能更具可读性。但是,如果您确实想使用他使用空合并运算符,这将实现以下目的:

foreach (var item in Model.PublishedSong.RelatedSongs != null 
                             ? Model.PublishedSong.RelatedSongs.Select((value, i) => new { value, i }) 
                             : Enumerable.Empty <dynamic>())
{
}
foreach(Model.PublishedSong.RelatedSongs??Enumerable.Empty())中的var项。选择((value,i)=>new{value,i}))
{
}

在尝试迭代
RelatedSongs
之前,您必须执行空检查。在您问题中的示例中,您是在尝试迭代之后执行空检查的,因此出现异常。

为什么不在迭代之前测试RelatedSongs的空值?使用??运算符进行如此复杂的代码有什么意义?您期望的是什么de>null
模型的某些部分。PublishedSong.RelatedSong
,或该集合中的某些项?基本上
Select
不会返回
null
,因此编译器会告诉您,在目前情况下,将永远不会使用null合并运算符。为什么不在迭代RelatedSong之前测试它们的null值?有什么问题在这样复杂的带有运算符的代码中,要点是什么?您希望
null
、模型的某些部分.PublishedSong.RelatedSong、或该集合中的某些项是什么?基本上
Select
不会返回
null
,因此编译器告诉您,就目前而言,null合并运算符将返回永远不要使用。这与OP不同。您使用??替换选择值,而OP使用它在两个序列之间进行选择。他在那里使用错误,在他的示例中,?的左边永远不会为空。这与OP不同。您使用??替换选择值,而OP使用它在两个序列之间进行选择。他在那里使用错误,左边当然,在他的例子中,永远不会是空的。我个人认为,首先检查集合是否为
null
,如果是,则跳过
foreach
。@juharr我同意,但我更倾向于不选择样式,而是关注问题本身。如果选择这种解决方案,请使用
正面日志ic
,即:消除一个NOT运算符,以得到如下结果:
。在RSongs==null?Enum.empty():Select()
,我个人认为,首先检查集合是否为
null
,如果是,则跳过
foreach
。@juharr我同意,但更倾向于避免风格选择,而忽略