将嵌套在ForEach循环中的for循环转换为LINQ

时间:2016-09-01 09:15:46

标签: c# 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)))
                );
        }

但后来我遇到了一个错误:/

4 个答案:

答案 0 :(得分:6)

因为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
}

答案 1 :(得分:1)

您要替换的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<>

答案 2 :(得分:1)

问题出在'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
    }

答案 3 :(得分:0)

如果你在你的方法上使用任何返回类型,你必须在方法的最后一个大括号之前返回任何方法类型的东西。如果你使用返回类型为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;
}