繁体   English   中英

收益率IEnumerable <IEnumerable<…> &gt;

[英]Yield return IEnumerable<IEnumerable<…>>

以下代码创建List<string>的中间实例,并在yield返回之前将值附加到它。 有没有一种好方法可以避免创建实例并且直接返回单元格值?

IEnumerable<IEnumerable<string>> GetStrValues()
{
    ......
        foreach (var r in rows)
        {
            var row = new List<string>();
            foreach (var c in r.Cells())
            {
                var value = getCellStr(c);
                row.Add(value);
            }
            yield return row;
        }
    }
}

为避免创建列表,您可以使用LINQ:

IEnumerable<IEnumerable<string>> GetStrValues()
{
     return rows.Select(r => r.Cells().Select(getCellStr));
}

这将懒惰地执行,即不会创建中间列表。 这是一种避免分配你不需要的内存的简洁方法(除非你要在内部IEnumerable<string>多次迭代,并且getCellStr很昂贵)。

您可以使用两个函数获得每个单元格的自定义操作。

IEnumerable<IEnumerable<string>> GetStrValues()
{
    ......
        foreach (var r in rows)
        {
            yield return GetCellValues(row);
        }
    }
}

IEnumerable<string> GetCellValues(Row r)
{
    foreach (var c in r.Cells())
    {
        yield return getCellStr(c);
    }  
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM