C# 什么';这两个过程的区别是什么?
第一个使用IEnumerable Single方法,它有一个InvalidOperationExceptionC# 什么';这两个过程的区别是什么?,c#,.net,C#,.net,第一个使用IEnumerable Single方法,它有一个InvalidOperationException RowObjectType = rowObjectAssemblyTypes.Single(type => type.Name == rowObjectTypeName); 我认为第二个和第一个做的是一样的,它工作得很好 foreach (var type in rowObjectAssemblyTypes) { if (type.Nam
RowObjectType = rowObjectAssemblyTypes.Single(type => type.Name == rowObjectTypeName);
我认为第二个和第一个做的是一样的,它工作得很好
foreach (var type in rowObjectAssemblyTypes)
{
if (type.Name == rowObjectTypeName)
{
RowObjectType = type;
}
}
我正在使用.Net3.5。有谁能告诉我它们之间的区别吗?第一个可能会崩溃,因为没有项目或有多个项目。这可能是一个bug,
Single
提醒您注意这一点,这很好
循环不在乎。它可能永远不会分配给RowObjectType
,或者多次分配。这在语义上可能不是你想要的
如果您希望零项,则使用SingleOrDefaultSingle(…)
要求正好有一项满足条件。
如果有多个项目满足条件,它将抛出异常。
可能您需要首先(…)
第一个是使用Linq从列表中返回单个对象,如果有多个对象与rowObjectTypeName
同名,则它将抛出异常
第二个允许多个对象包含与rowObjectTypeName
相同的名称。但是,最终结果将是最后一个匹配。。single
返回序列中type.Name==rowObjectTypeName
的唯一元素,如果序列中没有一个元素,则抛出异常
当您的第二个循环分配(如果适用于多个或无)时,从技术上看,这两个循环的工作方式不同
RowObjectType = rowObjectAssemblyTypes.Single(type => type.Name == rowObjectTypeName);
将返回枚举中的唯一元素。如果有多个元素或没有元素,此方法将引发异常。更可靠的方法是使用SingleOrDefault()
并检查null
第二
foreach (var type in rowObjectAssemblyTypes)
{
if (type.Name == rowObjectTypeName)
{
RowObjectType = type;
}
}
将始终将满足if
-语句的rowObjectAssemblyTypes
的最后一个元素分配给RowObjectType
。如果只有一个,它将被正确分配。但是,如果有更多对象,则将指定枚举中的最后一个对象
如果你只想要第一个,考虑一下;
foreach (var type in rowObjectAssemblyTypes)
{
if (type.Name == rowObjectTypeName)
{
RowObjectType = type;
break;
}
}
或者,甚至更好
RowObjectType = rowObjectAssemblyTypes.FirstOrDefault(type => type.Name == rowObjectTypeName);
您的意思是,如果存在两个与条件匹配的项,它将遇到InvalidOperationException?您可以使用FirstOrDefault()而不是Single()@mageos(不清楚)。这会删除异常,但可能会留下一个bug。抑制错误不是一个修复方法。@usr,如果返回的类型将是一个对象,则默认值为null。一个简单的例子是if(RowObjectType==null)允许处理错误情况。@mageos我更关心的是多个项目可能匹配的情况。这可能是出乎意料的,因为他会得到任何这样的东西,而不是他可能期待的一个。谢谢回答。谢谢回答。