将嵌套在ForEach循环中的for循环转换为LINQ
本文关键字:循环 for 转换 LINQ 嵌套 ForEach | 更新日期: 2023-09-27 18:05:02
我得到一个编译错误"不是所有的代码路径返回一个值"对以下代码,怎么来的?
public class SomeEntity
{
public int m_i;
public SomeEntity(int i)
{
m_i = i;
}
public override string ToString()
{
return m_i.ToString();
}
public static int someFunction(int i) { return i + 100; }
public static IEnumerable GetEntities()
{
int [] arr = {1,2,3};
foreach (int i in arr)
{
// for (int i = 0; i < someArray.Count();i++)
// yield return new SomeEntity(someFunction(i));
// *** Equivalent linq function ***
return Enumerable.Range(0, 7).Select(a => new SomeEntity(someFunction(a)));
}
}
}
我似乎不明白.....我尝试将外部foreach循环转换为linq表达式
public static IEnumerable GetEntities()
{
int [] arr = {1,2,3};
return arr.Select(Xenv =>
Enumerable.Range(0, 7).Select(a => new SomeEntity(someFunction(a)))
);
}
然后我就得到了一个错误:/
因为有可能arr是空的,并且您不会在foreach循环中返回。在foreach循环后放一个return
public static IEnumerable GetEntities()
{
int[] arr = { 1, 2, 3 };
foreach (int i in arr)
{
// for (int i = 0; i < someArray.Count();i++)
// yield return new SomeEntity(someFunction(i));
// *** Equivalent linq function ***
return Enumerable.Range(0, 7).Select(a => new SomeEntity(someFunction(a)));
}
return Enumerable.Empty<int>(); // <<<< this is what you need
}
要替换的yield
代码返回的IEnumrable<SomeEntity>
而新代码返回IEnumarable<IEnumrable<SomeEntity>>
.
可以使用SelectMany
public static IEnumerable GetEntities()
{
int [] arr = {1,2,3};
return arr.SelectMany(Xenv =>
Enumerable.Range(0, 7).Select(a => new SomeEntity(someFunction(a)))
);
}
边注:使用旧的非泛型IEnumerable
,它阻止。net编译器进行类型一致性检查。始终使用通用的IEnumerable<>
与特定的类型。
问题在于'foreach'循环:程序不能假设循环总是至少迭代它一次。
如果要迭代的数组长度为0,则不会调用循环内的代码;因此return语句不会被触发;导致并非所有代码路径都返回值的错误。为了解决这个问题,你需要在循环之外放置一个返回语句:public static IEnumerable GetEntities()
{
int [] arr = {1,2,3};
foreach (int i in arr)
{
// for (int i = 0; i < someArray.Count();i++)
// yield return new SomeEntity(someFunction(i));
// *** Equivalent linq function ***
return Enumerable.Range(0, 7).Select(a => new SomeEntity(someFunction(a)));
}
//INSERT RETURN STATEMENT HERE
}
如果你在你的方法上使用任何返回类型,你必须在方法的最后大括号之前返回任何带有method in类型的东西,如下所示。如果您使用void
返回类型,则无需返回任何内容。public static IEnumerable GetEntities()
{
int [] arr = {1,2,3};
foreach (int i in arr)
{
// for (int i = 0; i < someArray.Count();i++)
// yield return new SomeEntity(someFunction(i));
// *** Equivalent linq function ***
var numcol = Enumerable.Range(0, 7).Select(a => new SomeEntity(someFunction(a)));
}
return numcol;
}