产量 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
很昂贵)。
以下代码创建了一个 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
很昂贵)。