我偶然发现了一个有趣的场景,但我找不到解决方案。假设我必须在一个序列中找到主要部分(至少出现 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/

10-11 22:17
查看更多