这两个过程有什么区别?

时间:2015-05-12 09:31:47

标签: c# .net

第一个使用IEnumerable Single方法,它有一个InvalidOperationException。

RowObjectType = rowObjectAssemblyTypes.Single(type => type.Name == rowObjectTypeName);

我认为第二个与第一个完全相同,而且效果很好。

foreach (var type in rowObjectAssemblyTypes)
        {
            if (type.Name == rowObjectTypeName)
            {
                RowObjectType = type;
            }
        }

我正在使用.Net3.5。谁能告诉我他们之间的区别?

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相同的名称。但是,最终结果将是最后一场比赛。