簡體   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