0

我有来自MSDN 示例的以下代码:

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<> 方法实际上必须枚举所有数据,那么这也是多余的,但是 MSDN 文档没有说明这种转换是如何发生的。

我正在考虑使用的替代方法是:

var foundRow = sheetData.Elements<Row>().Where(r => r.RowIndex == rowIndex);
if (foundRow.Count() != 0)
{
    row = foundRow.First();
...

但是,我想从以前的经验中知道哪个会更快以及为什么。

谢谢。

4

2 回答 2

5

更清洁的选择是:

var row = sheetData.Elements<Row>()
                   .FirstOrDefault(r => r.RowIndex == rowIndex);
if (row != null)
{
    // Use row
}

这只会遍历序列一次,一旦找到匹配项就会停止。

于 2013-05-08T13:48:58.133 回答
1

.Count()和方法都ToDictionary必须枚举所有元素才能获得结果。

这是最有效的实现:

var foundRow = sheetData.Elements<Row>().FirstOrDefault(r => r.RowIndex == rowIndex);
if (foundRow != null)
{
    row = foundRow;

...
于 2013-05-08T13:52:09.177 回答