我有MSDN sample的以下代码:
if (sheetData.Elements<Row>().Where(r => r.RowIndex == rowIndex).Count() != 0)
{
row = sheetData.Elements<Row>().Where(r => r.RowIndex == rowIndex).First();
...
我重构的内容如下:
Dictionary<uint, Row> rowDic = sheetData.Elements<Row>().ToDictionary(r => r.RowIndex.Value);
if (rowDic[rowIndex].Count() != 0)
{
row = rowDic[rowIndex];
...
现在,我感觉如果Enumerable.ToDictionary&lt;&gt;方法实际必须枚举所有数据,然后这也是多余的,但MSDN文档没有说明如何进行这种转换。
我正在考虑使用的替代方案是:
var foundRow = sheetData.Elements<Row>().Where(r => r.RowIndex == rowIndex);
if (foundRow.Count() != 0)
{
row = foundRow.First();
...
但是,我想知道以前的经验可能更快,为什么。
感谢。
答案 0 :(得分:5)
更清洁的选择是:
var row = sheetData.Elements<Row>()
.FirstOrDefault(r => r.RowIndex == rowIndex);
if (row != null)
{
// Use row
}
只会迭代序列一次,一旦找到匹配就会停止。
答案 1 :(得分:1)
.Count()
和ToDictionary
方法都必须枚举所有元素才能获得结果。
这是最有效的实施方式:
var foundRow = sheetData.Elements<Row>().FirstOrDefault(r => r.RowIndex == rowIndex);
if (foundRow != null)
{
row = foundRow;
...