这是一个真正的性能问题。
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;
}
答案 0 :(得分:1)
如果在framecode
上订购了SetTable中的数据,那么您可以通过数据结构使用binary search来减少查找次数。
如果数据中没有可以利用的模式,优化性能可能会变得棘手。这假设您无法将数据从SetTable
导出到查找速度更快的结构中。
如果在同一组数据上频繁调用此Find方法,那么您可能还需要考虑创建索引结构(字典)以加速后续查找。这可以减少一遍又一遍地迭代相同数据的成本。
<小时/> 另外,另外,在检查
NullReferenceException
参数时不要抛出SetTable
,而是抛出ArgumentNullExeception
。当取消引用null的引用变量时,CLR抛出空引用异常...它不应该被您的代码抛出。
答案 1 :(得分:0)
通过与表中的列交换行,您可能会得到一些改进。从表中的一行顺序获取元素比获取每个第n个元素要快。 (它与缓存未命中有关)
答案 2 :(得分:0)
大部分时间用于将文本转换为整数。既然你说这是一个时间问题,听起来你就是在调用它 - 你有什么办法可以将数据存储为整数而不是字符串吗?
答案 3 :(得分:0)
使用字典。
Key -- SetTable.Rows[i][0]
Value -- SetTable.Rows[i-1][0].
然后当你得到一个帧码时,只需在字典中查找即可。如果它在那里,返回值。
通过在键和值上使用Convert.Int32,然后在字典中存储之前,您可以获得更高的效率,然后无需进一步转换。
答案 4 :(得分:0)
假设
(1)SetTable是一个DataTable
(2)framecodeColumn可能是你的列名
(3)framecodeColumn发生在索引0(第一列)
尝试以下方法:
SetTable.Select(“framecodeColumn&lt; framecodeValuePassedToYourMethod”,“framecodeColumn DESC”)[0]。[0]
基本上,通过传递过滤器,使用“Select()”方法查找DataRowCollection,按降序对结果进行排序,第一行将是您要查找的行。
当然,请使用所有需要的检查保护此行(例如,使用“GetLength()”方法查看是否确实存在满足过滤条件的结果等等。)