这个问题今天真的让我感到困惑。我正在使用Visual Studio 2012,C#.net 4应用程序(不确定是否重要)。
我有一些数据表,其中包含多个结果。为了找到最好的选择,我正在寻找具有最佳Jaro-Winkler得分的那个,并将其送回去。
我通过制作数据视图对表格结果进行排序,并试图正确处理我的数据元素,我将数据视图包装在一个使用的语句中。代码如下所示:
public static DataRow getBestCandidate(DataTable searchTable, string searchName)
{
if (searchTable.Rows.Count == 1) //Nothing to do if there's only one row
{
return searchTable.Rows[0];
}
int tableSize = searchTable.Rows.Count;
for (int i = 0; i < tableSize; i++)
{
//Iterate through each entry and record the Jaro distance between our original search term.
searchTable.Rows[i][7] = jaro.getScrubbedDistance(searchTable.Rows[i][1].ToString(), searchName);
}
using (DataView dv = searchTable.DefaultView) //Sort the results
{
dv.Sort = "JaroDistance desc";
return dv[0].Row; //Send back the result with the highest Jaro score.
}
}
这就是奇怪的。我第一次打电话给它,它运作得很好。正如我所希望的那样。 如果我从同一个方法连续两次调用它,它几乎可以第二次工作。当运行跟踪时,它一直到“return dv [0] .Row;”行,当它执行时,对象DV为空。它的行为与我完成之前处理的对象完全相同。最终会以异常方式杀死该线程。
我拿出了使用声明并将其替换为:
DataView dv = searchTable.DefaultView;
dv.Sort = "JaroDistance desc";
return dv[0].Row;
然后它工作得很好。锤击这些方法似乎并没有造成巨大的内存峰值。
是否需要使用包装?为什么它在我返回之前变为空?
答案 0 :(得分:1)
假设searchTable
是同一个实例,那么每次调用方法时,都会丢弃它所共享的DefaultView
对象。
此处不需要using
,而是在任何父方法管理该对象的searchTable
周围。