我偶然发现了一个有趣的场景,但我找不到解决方案。假设我必须在一个序列中找到主要部分(至少出现 n / 2 + 1
次的数字,其中 n
是序列的大小)。这是我的实现:
public static int FindMajorant(IList<int> numbers)
{
return numbers
.GroupBy(x => x)
.Where(g => g.Count() >= numbers.Count / 2 + 1)
.Select(g => g.Key)
.SingleOrDefault();
}
我正在使用
SingleOrDefault()
,它返回在序列中找到的元素或类型的默认值:在这种情况下,它将返回 0
因为它是 int
的默认值。例如,我的方法为以下序列返回 3
:List<int> sampleNumbers = new List<int>() { 2, 2, 3, 3, 2, 3, 4, 3, 3 };
这是预期的行为。
但是,如果序列中的主要元素为零 (
0
) 会发生什么?它会返回 0,但是那样的话,我怎么能确定它是 SingleOrDefault()
中的零作为默认值,还是主要值?也许,我可以使用 Single()
,但这会抛出一个非常不正确的异常。我也可以捕获这个异常,但这对我来说似乎是一个不好的做法。所以我的问题是,处理这种情况的首选方法是什么? 最佳答案
使用可以为空的值,其中 null
表示没有majorant,而不是使用“0”来表示。很方便的是, int?
的默认值是 null
,所以你的代码唯一需要改变的是在调用 SingleOrDefault
之前获得一系列可为空的整数。
public static int? FindMajorant(IList<int> numbers)
{
return numbers
.GroupBy(x => x)
.Where(g => g.Count() >= numbers.Count / 2 + 1)
.Select(g => (int?)g.Key)
.SingleOrDefault();
}
关于c# - SingleOrDefault() 当序列包含默认值时,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33400638/