我正在尝试编写Linq MinBy扩展方法
public static class Extensions
{
public static T MinBy<T>(this IEnumerable<T> source, Func<T,int> selector)
{
T min;
int? minKey = null;
foreach (var x in source)
{
var key = selector(x);
if (minKey == null || key < minKey)
{
minKey = key;
min = x;
}
}
if (minKey == null)
{
throw new ArgumentException("source should not be empty");
}
return min;
}
}
我认为我的逻辑是正确和可读的。但是我收到了构建错误
使用未分配的局部变量'min'
我该怎么办?我可以测试变量是否已分配?
澄清:MinBy函数可以回答以下问题。哪个数字[-5,-2,3]具有最小的平方?
> new List<int>{-5,-2,3}.MinBy(x => x*x)
-2
.NET的Min函数回答了一个不同的问题(这是最小的正方形)
> new List<int>{-5,-2,3}.Min(x => x*x)
4
答案 0 :(得分:23)
您需要min
的默认值,如下所示:
T min = default(T);
You can read more about default()
on MSDN:
给定参数化类型T的变量t,语句t = null 仅当T是引用类型且t = 0才有效时才有效 数值类型,但不适用于结构。解决方案是使用 default关键字,它将为引用类型返回null并为零 对于数值类型。对于结构,它将返回每个成员 struct初始化为零或null,具体取决于它们是否为 价值或参考类型。对于可为空的值类型,default返回a System.Nullable,它像任何结构一样被初始化。
答案 1 :(得分:4)
为min
添加默认值:
T min = default(T);
它抱怨的原因是编译器无法验证min
在return min;
行中使用之前是否已赋值。无法引用未分配的局部变量,因此编译器会生成错误。
答案 2 :(得分:1)
这是因为在条件内分配了min。编译器无法确定它是否会获得值,您应该使用default值初始化min。
答案 3 :(得分:-1)
仅供参考,这是我最终的结果
public static T MinBy<T>(this IEnumerable<T> source, Func<T,int> selector)
{
T min = default(T);
bool started = false;
int minKey = default(int);
foreach (var x in source)
{
var key = selector(x);
if (!started || key < minKey)
{
minKey = key;
min = x;
started = true;
}
}
if (!started)
{
throw new ArgumentException("source should not be empty","source");
}
return min;
}
答案 4 :(得分:-1)
否,您无法测试是否已分配变量,您将始终收到编译错误。