我偶然发现了一个有趣的场景,我无法找到解决方案.假设我必须在一个序列中找到majorant(至少出现的数字,序列的大小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();
}
Run Code Online (Sandbox Code Playgroud)
我正在使用SingleOrDefault(),如果在序列中找到该元素或返回该类型的默认值,则返回该元素:在这种情况下,它将返回,0因为它是一个的默认值int.例如,我的方法返回3以下序列:
List<int> sampleNumbers = new List<int>() { 2, 2, 3, 3, 2, 3, 4, 3, 3 };
Run Code Online (Sandbox Code Playgroud)
这是预期的行为.
但是,如果序列中的主要部分为零(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();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
355 次 |
| 最近记录: |