将数据视图包装在using语句中会产生奇怪的结果.我是不是滥用了

本文关键字:结果 是不是 包装 视图 数据 using 语句 | 更新日期: 2023-09-27 18:15:32

今天这个问题真的把我难住了。我在Visual studio 2012中工作,c# .net 4应用程序(不确定是否重要)。

我有一些数据,其中有多个结果。为了找出最好的选择,我正在寻找Jaro-Winkler得分最高的那个,然后把它寄回来。我通过创建数据视图对表结果进行排序,并且为了正确处理数据元素,我将数据视图包装在using语句中。代码看起来像这样:

 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为空。它的行为就像这个物体在我处理它之前就被处理掉了。这将以异常结束该线程。

我去掉了using语句,并将其替换为:

 DataView dv = searchTable.DefaultView;
                    dv.Sort = "JaroDistance desc";
                    return dv[0].Row;

那么它工作得很好。敲打这些方法似乎不会造成巨大的内存峰值。

是否需要using包装器?为什么在我返回它之前它就变成空了?

将数据视图包装在using语句中会产生奇怪的结果.我是不是滥用了

假设searchTable是相同的实例,您正在处理它的DefaultView,这是您每次调用该方法时共享的对象。

这里不需要using,而是在管理该对象的任何父方法的searchTable周围。