如何将Enumerable转换为字典?

时间:2013-05-08 13:46:48

标签: c# .net linq enumerable

我有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();
...

但是,我想知道以前的经验可能更快,为什么。

感谢。

2 个答案:

答案 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;

...