将嵌套在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)))
                );
        }

然后我就得到了一个错误:/

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

因为有可能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;
}