产量返回IEnumerable <IEnumerable <... >>

ca9*_*3d9 2 c# linq deferred-execution

以下代码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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Gro*_*roo 7

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

IEnumerable<IEnumerable<string>> GetStrValues()
{
     return rows.Select(r => r.Cells().Select(getCellStr));
}
Run Code Online (Sandbox Code Playgroud)

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