Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.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# 什么';这两个过程的区别是什么?_C#_.net - Fatal编程技术网

C# 什么';这两个过程的区别是什么?

C# 什么';这两个过程的区别是什么?,c#,.net,C#,.net,第一个使用IEnumerable Single方法,它有一个InvalidOperationException RowObjectType = rowObjectAssemblyTypes.Single(type => type.Name == rowObjectTypeName); 我认为第二个和第一个做的是一样的,它工作得很好 foreach (var type in rowObjectAssemblyTypes) { if (type.Nam

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

RowObjectType = rowObjectAssemblyTypes.Single(type => type.Name == rowObjectTypeName);
我认为第二个和第一个做的是一样的,它工作得很好

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

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

第一个可能会崩溃,因为没有项目或有多个项目。这可能是一个bug,
Single
提醒您注意这一点,这很好

循环不在乎。它可能永远不会分配给
RowObjectType
,或者多次分配。这在语义上可能不是你想要的

如果您希望零项,则使用
SingleOrDefault

Single(…)
要求正好有一项满足条件。
如果有多个项目满足条件,它将抛出异常。


可能您需要
首先(…)

第一个是使用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我更关心的是多个项目可能匹配的情况。这可能是出乎意料的,因为他会得到任何这样的东西,而不是他可能期待的一个。谢谢回答。谢谢回答。