C# DefaultIfEmpty仍引发异常序列不包含匹配元素
我有一个方法如下所示:C# DefaultIfEmpty仍引发异常序列不包含匹配元素,c#,linq,defaultifempty,C#,Linq,Defaultifempty,我有一个方法如下所示: public static string MyMethod(string myParameter) { var defaultProperty = new Validation() {IDNumber = "ID Number Not Found", Logon = "ID Number Not Found" }; try { return lstLogons.DefaultIfEmpty(defaultProperty).Sing
public static string MyMethod(string myParameter)
{
var defaultProperty = new Validation() {IDNumber = "ID Number Not Found", Logon = "ID Number Not Found" };
try
{
return lstLogons.DefaultIfEmpty(defaultProperty).Single(x => x.IDNumber == myParameter).Logon;
}
catch (Exception exception)
{
throw new ArgumentException(exception.Message, myParameter);
}
}
测试时,我会给myParameter
一个我知道不存在的值,因此我希望能够为这些类型的情况提供一个默认值。但是,它只是抛出一个异常:
序列不包含匹配元素
我知道它不包含我正在搜索的元素。。因此需要/想要一个默认值
我如何才能做到这一点?这是因为在此之后您将调用
Single()
,并且DefaultIfEmpty()
将返回集合,其中只有一个项,而调用Single()
意味着其中始终有一个项与您指定的条件不匹配,这里需要的是SingleOrDefault()
,如果找不到匹配项,它将不会引发异常,插入后它将返回null
我想返回一个默认值
可以使用默认值为其创建局部变量:
var logon = String.Empty;
var result = lstLogons.SingleOrDefault(x => x.IDNumber == myParameter);
if(result!=null)
logon = result.Logon;
return logon;
除非
myParameter
是“找不到ID号”
,否则该异常是合乎逻辑的。请提供更多代码。没有足够的信息。然而,这是你的单次
呼叫。@DanielA.White实际上是我处理这个问题的全部代码。。基本上,如果我从lambda中取出DefaultIfEmpty
。。只有lstLogons.Single(x=>x.IDNumber==myParameter)代码>。。如果找不到myParameter
,我不希望引发异常。。我只需要一个默认值。您的defaultProperty
没有匹配myParameter
的IDNumber
,因此.Single()
抛出。什么lstLogons
?这与“defaultProperty”有什么关系?DefaultIfEmpty()将返回不包含任何项的集合-不,不会。如果源为空,它将返回一个包含单个元素(类型的默认值)的集合。。。因此得名。但是,Single
接受谓词的重载与…@jonsket my bad,感谢您的更正,更新后反映了:)运行此命令时,在使用SingleOrDefault
时使用defaultProperty
有什么目的吗?IfSingleOrDefault
返回一个空值,而不使用DefaultIfEmpty
。。那么创建defaultProperty
就没有用了?啊,明白了。我认为这只是同时执行的一整行。。并且没有想到先运行SingleOrDefault
,然后再检索Logon
。清晨。。我需要更多的咖啡因。谢谢你的帮助。非常感谢。不用担心,喝杯咖啡;)很高兴能帮助@GTown编码器