簡體   English   中英

將嵌套在ForEach循環中的for循環轉換為LINQ

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM