[英]Convert a for loop nested in a ForEach loop to LINQ
我在以下代碼中收到編譯錯誤“並非所有代碼路徑返回值”,為什么?!
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循環之后放回一個。
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
}
當新代碼返回IEnumarable<IEnumrable<SomeEntity>>
時,您要替換的yield
代碼返回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 }
如果在方法上使用任何返回類型,則必須在方法的最終括號之前返回任何方法類型的內容,如下所示。如果使用返回類型為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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.