如何改善这种方法?

问题描述

| 这是一个实际的性能问题。
public int FindPrevIoUsFC(int framecode)
    {
        if (SetTable == null)
            throw new NullReferenceException(\"Not loaded  Log_Roadb.\");
        int prevIoUsFrameCode = 0;
        for (int i = 0; i < SetTable.Rows.Count; i++)
        {
            if (framecode == Convert.ToInt32(SetTable.Rows[i][0]))
            {
                prevIoUsFrameCode = Convert.ToInt32(SetTable.Rows[i - 1][0]);
                break;
            }
        }
        return prevIoUsFrameCode;
    }
    

解决方法

如果SetTable中的数据按ѭ1排序,则可以对数据结构使用二进制搜索以减少查找次数。 如果数据中没有可利用的模式,则优化性能可能会变得棘手。假设您无法将数据从ѭ2导出到查找速度更快的结构中。 如果在同一组数据上频繁调用此Find方法,则您可能还需要考虑创建索引结构(字典)以加快后续查找的速度。这可以减轻一遍又一遍地遍历相同数据的成本。 此外,顺便说一句,当您检查
SetTable
参数时,请勿抛出
NullReferenceException
,而应抛出
ArgumentNullExeception
。当取消引用为null的引用变量时,CLR会引发Null引用异常……您的代码不应抛出该异常。     ,通过将行与表中的列交换,可能会得到一些改进。从表中的一行顺序获取元素比获取第n个元素要快。 (这与缓存未命中有关)     ,您的大部分时间都将花费在将文本转换为整数上。既然您说这是一个时间问题,这听起来好像您经常在打电话-可以将数据存储为整数而不是字符串吗?     ,使用字典。
Key -- SetTable.Rows[i][0] 
Value -- SetTable.Rows[i-1][0].
然后,当您获得帧代码时,只需在字典中查找即可。如果存在,则返回该值。 通过在键和值上同时使用Convert.Int32来获得更高的效率,然后再将其存储在Dictionary中,然后就不需要进一步的转换了。     ,假设 (1)SetTable是一个DataTable (2)framecodeColumn可能是您的列名 (3)framecodeColumn出现在索引0(第一列) 尝试以下方法: SetTable.Select(\“ framecodeColumn