10

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

4

4 回答 4

11

您可以使用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
于 2013-10-03T18:06:39.260 回答
10

你可以使用:

var first = theIntegers
                .Cast<int?>()
                .SingleOrDefault(i => i == theValue) ?? valueIfNotFound;

这通过将项目转换为 a Nullable<int>,然后使用null-coalescing 运算符 返回您选择的值(如果null返回)(即:未找到)。

请注意,如果您有多个匹配项,则会抛出此错误。如果您不想要这种行为,请使用FirstOrDefault而不是SingleOrDefault.

于 2013-10-03T17:59:24.980 回答
0

也许您的问题已简化,因此这不适用,但如果您只是在寻找一个您已经知道的数字,并且如果它不在列表中,则想要返回一个任意数字,您可以使用 Any-Extension 方法:

int numberToLookFor = 42;
int arbitraryReturnOnNotFound = 17;

int result = numbers.Any( n => n == numberToLookFor ) ? numberToLookFor : arbitraryReturnIfNotFound;
于 2013-10-03T18:17:34.310 回答
0

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

于 2013-10-03T17:58:15.443 回答