C# 如果使用SingleOrDefault()并在数字列表中搜索不在列表中的数字,如何返回null?

C# 如果使用SingleOrDefault()并在数字列表中搜索不在列表中的数字,如何返回null?,c#,linq,C#,Linq,使用SingleOrDefault()查询正数列表时,如果列表中找不到一个数字,而不是类型的默认值(本例中为0),如何返回null或自定义值,如-1?必须将列表中的类型更改为int?(可为null的int)。对于整数,返回的默认值为0。对于引用类型,它将为null。如果不重载该方法,则无法将默认retrurn值设为自定义值。您可以使用: var first = theIntegers .Cast<int?>() .Sin

使用
SingleOrDefault()
查询正数列表时,如果列表中找不到一个数字,而不是类型的默认值(本例中为0),如何返回null或自定义值,如-1?

必须将列表中的类型更改为
int?
(可为null的int)。对于整数,返回的默认值为0。对于引用类型,它将为null。如果不重载该方法,则无法将默认retrurn值设为自定义值。

您可以使用:

var first = theIntegers
                .Cast<int?>()
                .SingleOrDefault(i => i == theValue) ?? valueIfNotFound;
var first=theIntegers
.Cast()
.single或default(i=>i==值)??未找到值;
这是通过将项目强制转换为可为
null
,然后在返回
null
时使用返回您选择的值(即:未找到)


请注意,如果您有多个匹配项,则会抛出此选项。如果不希望出现这种行为,请使用
FirstOrDefault
而不是
SingleOrDefault

您可以使用
DefaultIfEmpty
为空集合指定自定义默认值:

var value = numbers.Where(MyFilter)
    .DefaultIfEmpty(-1) //or any other default value you want
    .Single(); //OrDefault not needed; DefaultIfEmpty ensures there is an item

可能您的问题已简化,因此不适用,但如果您只查找您已经知道的数字,如果不在列表中,则希望返回任意数字,则可以使用任意扩展方法:

int numberToLookFor = 42;
int arbitraryReturnOnNotFound = 17;

int result = numbers.Any( n => n == numberToLookFor ) ? numberToLookFor : arbitraryReturnIfNotFound;

不能更改SingleOrDefault的行为,如果是int,它将始终返回对象的默认值,如果是int,则返回0?->无效的采用下面发布的方法之一解决此问题;)@埃拉:我明白。我的问题的目的是绕开它。@Servy我假设OP没有错误地使用它,而不是
FirstOrDefault
,已经有一些关于方法选择的错误答案。@evanmcdonnal我的评论直接针对Reed,谁说当列表中有两个项目时,
SingleOrDefault
将返回默认值;此后,他对自己的答案进行了编辑。我假设OP知道他在做什么,当他选择使用
Single
@Servy是的,我在修改它的时候实际上把它弄糟了;)(现在更正)这是真的;您可以将查询作为一个整体进行修改(以相当简单的方式)以实现该目标。一般来说,这不是一个不可能的问题,也不一定是任何其他的价值。例如,null将抛出异常。@TravisJ该类型的任何值。您不能完全指定其他类型的值,这是正确的。哦,如果值不是正确的类型,它不会抛出异常;相反,它不会编译。