C#测试是否分配了变量
我正在尝试编写一个Linq MinBy扩展方法C#测试是否分配了变量,c#,.net,linq,C#,.net,Linq,我正在尝试编写一个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) {
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;
}
}
公共静态类扩展
{
public static T MinBy(此IEnumerable源,Func选择器)
{
T分钟;
int?minKey=null;
foreach(源中的变量x)
{
var键=选择器(x);
if(minKey==null | | key
我认为我的逻辑是正确和可读的。但是我得到了一个构建错误
未分配局部变量“min”的使用
我能做些什么?我可以测试变量是否已赋值吗
澄清:MinBy函数可以回答以下问题。下列哪个数字[-5,-2,3]的平方最小
> new List<int>{-5,-2,3}.MinBy(x => x*x)
-2
>新列表{-5,-2,3}.MinBy(x=>x*x)
-2
.NET的最小值函数回答了一个不同的问题(最小的平方)
>新列表{-5,-2,3}.Min(x=>x*x)
4.
您需要一个min
的默认值,如下所示:
T最小值=默认值(T)代码>
给定参数化类型t的变量t,语句t=null
仅当T是引用类型且T=0仅适用于
数值类型,但不适用于结构。解决方法是使用
默认关键字,它将为引用类型返回null,为零
对于数值类型。对于结构,它将返回
结构初始化为零或null,具体取决于它们是否为零
值或引用类型。对于可为null的值类型,默认值返回
System.Nullable,与任何结构一样初始化
这是因为在条件中指定了min。编译器无法确定它是否将获得一个值,您应该使用该值初始化min 为min
添加默认值:
T min = default(T);
它抱怨的原因是编译器无法验证min
在返回min中使用之前是否已被赋值代码>行。无法引用未分配的局部变量,因此编译器会生成一个错误。FYI这就是我最终得到的结果
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;
}
public static T MinBy(此IEnumerable源代码,Func选择器)
{
T min=默认值(T);
bool start=false;
int minKey=默认值(int);
foreach(源中的变量x)
{
var键=选择器(x);
如果(!started | | key
否,您无法测试是否分配了变量,您总是会遇到编译错误。IQueryable在这方面比IEnumerable imho更好。请在MSDN上查看它,它是一种允许查询链接的集合类型,非常强大。您不能使用现有的IEnumerable.Min扩展方法吗?-这也允许你通过一个func:好问题,托比。我在原始问题中对我想要的行为进行了澄清。谢谢。这是否违背了我的逻辑?想了想,没有。
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;
}