C# 如何将可枚举项转换为字典?

C# 如何将可枚举项转换为字典?,c#,.net,linq,enumerable,C#,.net,Linq,Enumerable,我有以下代码来自: if(sheetData.Elements().Where(r=>r.RowIndex==RowIndex.Count()!=0) { row=sheetData.Elements()。其中(r=>r.RowIndex==RowIndex)。First(); ... 我将其重构如下: Dictionary<uint, Row> rowDic = sheetData.Elements<Row>().ToDictionary(r => r.RowI

我有以下代码来自:

if(sheetData.Elements().Where(r=>r.RowIndex==RowIndex.Count()!=0)
{
row=sheetData.Elements()。其中(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];
...
Dictionary rowDic=sheetData.Elements().ToDictionary(r=>r.RowIndex.Value);
如果(rowDic[rowIndex].Count()!=0)
{
行=行DIC[行索引];
...
现在,我感觉到,如果Enumerable.ToDictionary方法实际上必须枚举所有数据,那么这也是多余的,但是MSDN文档没有说明这种转换是如何发生的

我考虑使用的替代方案是:

var foundRow = sheetData.Elements<Row>().Where(r => r.RowIndex == rowIndex);
if (foundRow.Count() != 0)
{
    row = foundRow.First();
...
var foundRow=sheetData.Elements()。其中(r=>r.RowIndex==RowIndex);
如果(foundRow.Count()!=0)
{
row=foundRow.First();
...
然而,我想从以前的经验中知道哪一个更快,为什么


谢谢。

清洁剂替代品是:

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

它只会在序列中迭代一次,一旦找到匹配项,它就会停止。

更干净的替代方法是:

var row = sheetData.Elements<Row>()
                   .FirstOrDefault(r => r.RowIndex == rowIndex);
if (row != null)
{
    // Use row
}
var row=sheetData.Elements()
.FirstOrDefault(r=>r.RowIndex==RowIndex);
如果(行!=null)
{
//使用行
}
这只会在序列中迭代一次,一旦找到匹配项,它就会停止。

无论是
.Count()
还是
ToDictionary
方法都必须枚举所有元素才能获得结果

以下是最有效的实施:

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

...
var foundRow=sheetData.Elements().FirstOrDefault(r=>r.RowIndex==RowIndex);
if(foundRow!=null)
{
row=foundRow;
...
无论是
.Count()
还是
ToDictionary
方法都必须枚举所有元素才能获得结果

以下是最有效的实施:

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

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

什么是多余的?不太清楚你在问什么。但是
ToDictionary
会急切地迭代整个输入序列。如果你想知道两件事中哪一件更快,那么运行它们,你很快就会发现。什么是多余的?不太清楚你在问什么。但是
ToDictionary
会急切地遍历整个输入序列。如果你想知道这两件事中哪一件更快,那么运行它们,你很快就会发现.Redundant.Where子句.Lambda可以移动到.FirstOrDefault.e.g.
.FirstOrDefault(r=>r.RowIndex==RowIndex);
@spender:True-我总是忘记这一点。(计数同上).Nice catch.Same.Resharper通常会保存我。冗余的.Where子句.Lambda可以移动到.FirstOrDefault。例如
.FirstOrDefault(r=>r.RowIndex==RowIndex);
@spender:True-我总是忘记这一点。(计数同上)。Nice catch.Same.Resharper通常会保存我。