第一个使用IEnumerable Single方法,它有一个InvalidOperationException。
RowObjectType = rowObjectAssemblyTypes.Single(type => type.Name == rowObjectTypeName);
我认为第二个与第一个完全相同,而且效果很好。
foreach (var type in rowObjectAssemblyTypes)
{
if (type.Name == rowObjectTypeName)
{
RowObjectType = type;
}
}
我正在使用.Net3.5。谁能告诉我他们之间的区别?
答案 0 :(得分:4)
第一个可能崩溃,因为零项目或多个项目。这可能是一个错误,Single
提醒您注意这一点很好!
循环无关紧要。它可能永远不会分配给RowObjectType
或多次执行。这在语义上可能不是你想要的。
如果您希望零项目使用SingleOrDefault
。
答案 1 :(得分:2)
嗯,从技术上看,这两种方法的工作方式不同。
RowObjectType = rowObjectAssemblyTypes.Single(type => type.Name == rowObjectTypeName);
将返回枚举中的 only 元素。如果有多个元素或没有元素,则此方法将引发异常。更加可靠的方法是使用SingleOrDefault()
并检查null
。
第二个;
foreach (var type in rowObjectAssemblyTypes)
{
if (type.Name == rowObjectTypeName)
{
RowObjectType = type;
}
}
始终将rowObjectAssemblyTypes
的 last 元素(if
- 语句分配给RowObjectType
。如果只有一个,它将被正确分配。但是,如果还有更多,则将分配可枚举中的最后一个对象。
如果您只想要第一个,请考虑;
foreach (var type in rowObjectAssemblyTypes)
{
if (type.Name == rowObjectTypeName)
{
RowObjectType = type;
break;
}
}
或者,甚至更好;
RowObjectType = rowObjectAssemblyTypes.FirstOrDefault(type => type.Name == rowObjectTypeName);
答案 2 :(得分:1)
Single(...)
要求恰好一个项符合条件
如果多个项目满足条件,则会抛出异常
https://msdn.microsoft.com/en-us/library/vstudio/bb535118%28v=vs.100%29.aspx
也许你需要First(...)
答案 3 :(得分:1)
.single
返回type.Name == rowObjectTypeName
序列中唯一的元素,如果序列中没有一个元素则抛出异常
虽然你的第二个循环是分配,如果适用于多个或没有
答案 4 :(得分:0)
第一个是使用Linq从列表中返回单个对象,如果有多个对象与rowObjectTypeName
同名,那么它将抛出异常。
第二个允许多个对象包含与rowObjectTypeName
相同的名称。但是,最终结果将是最后一场比赛。