产量 return IEnumerable<IEnumerable<...>>

Yield return IEnumerable<IEnumerable<...>>

以下代码创建了一个 List<string> 的中间实例,并在 yield return 之前向其附加值。是否有避免创建实例并直接产生 return 单元格值的好方法?

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;
        }
    }
}

您可以使用两个函数获得每个单元格的延迟操作。

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);
    }  
}

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

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

这将延迟执行,即不会创建中间列表。这是避免分配您不需要的内存的好方法(除非您要在内部 IEnumerable<string> 上迭代多次,而 getCellStr 很昂贵)。