点跟踪配置文件,为什么我的内存提取被标记为慢

dot trace profile, why is my in memory fetch being flagged as slow

我该如何改进?

配置文件提示从列表中获取数据很慢

public List<RowDataDto> Rows { get; set; }

public RowDataDto GetRow(int rowNdx)
{
      var row = Rows.SingleOrDefault(x => x.LineNumber == rowNdx);
      return row;   
}

该列表平均包含大约 1000 个项目,我只是在进行基准测试以查看其性能。

它说最慢的部分是从内存列表中获取。

在调用 GetRow 之前填充行。

LineNumber 是一个 int32

PS - 我刚刚安装了 dotTrace,我对它还很陌生,所以我可能不了解如何正确使用该工具。我有简单的测试。我开始“.Net Process”告诉我的测试 运行 并在某个时候点击拍摄快照。

如果您以前使用过此工具,请指导我。

如果你有内存列表并且你想对其执行多次查找 - 最好使用字典而不是列表。为了便于使用,如果需要,您可以公开该字典值的只读集合(将字典公开为 public 成员通常不好):

private Dictionary<int, RowDataDto> _rows;
public IReadOnlyCollection<RowDataDto> Rows {get {return _rows.Values;}}

public RowDataDto GetRow(int rowNdx)
{
    var row = _rows.ContainsKey(rowNdx) ? _rows[rowNdx] : null;
    return row;   
}

另请注意,使用 SingleOrDefault 很少有用。如果您的列表不应包含重复项 - 只需使用 FirstOrDefaultSingleOrDefault 必须遍历整个列表以确保没有重复项,在这种情况下意味着它将始终遍历整个列表。