无法理解排序代码中的错误

时间:2010-07-28 22:51:51

标签: .net vb.net data-binding

我最近在接受采访时被问到一个奇怪的问题;

Private Function sorttable  (ByVal dt As DataTable, ByVal sorttype$, ByVal sort_direction$) As DataTable 
         Dim dv As DataView  
         Dim dt2 As DataTable  
         dt2 = dt.Clone  
         dt2.Merge(dt)  
         dv = dt2.DefaultView  
         dv.Sort = sorttype & " " & sort_direction  
         Return dv.ToTable()  
End Function

这个功能正常工作,但是有一个问题(至少是面试官声称的)。好吧,我无法弄清楚它是什么。有什么想法吗?

4 个答案:

答案 0 :(得分:1)

我从未使用DataViewDataTable,但代码不会处理这些对象。

答案 1 :(得分:1)

您无缘无故地创建了DataTable。

您可以使用此代码提供相同的结果

Private Function sorttable  (ByVal dt As DataTable, ByVal sorttype$, ByVal sort_direction$) As DataTable  
         Dim dv As DataView   
         dv = dt.DefaultView   
         dv.Sort = sorttype & " " & sort_direction   
         Return dv.ToTable()   
End Function 

答案 2 :(得分:0)

编辑:仅合并复制方案,而不是行。这就是你需要它的原因。

我看到的只有两个问题是Merge和冗余变量(dt2)。由于它们是按值传递的,因此没有理由制作额外的本地副本并为bug创建更多空间。这被称为代码气味。另外,为什么在刚刚创建已包含约束和模式的原始数据表的克隆时进行合并?这就像加倍。

答案 3 :(得分:0)

我正在创造这么好的答案,但我的FF已经崩溃......

所以很少说..

但是那里有什么

  • DataTable - 表示一个内存数据表。

    • 克隆 - 克隆DataTable的结构,包括所有DataTable架构和约束。

    • 合并(DataTable dataTable) - 此成员已重载。有关此成员的完整信息(包括语法,用法和示例),请单击重载列表中的名称。

    • DefaultView - 获取表格的自定义视图,该视图可能包含已过滤的视图或光标位置。

  • DataView - 表示DataTable的数据表,自定义视图,用于排序,过滤,搜索,编辑和导航。

    • 排序 - 获取或设置排序列,和DataView的排序顺序。 排序字符串结构 - “包含列名后跟”ASC“(升序)或”DESC“(降序)的字符串。默认情况下,列按升序排序。多个列可以用逗号分隔。” 克隆的方法与Copy几乎相同,唯一的区别是Clone方法创建的新DataTable不包含任何DataRows。

你在中期的冗余被认为是一个好的答案,在某些情况下可以是合理的,例如我们只想要那些数据的分类副本用于其他目的。但是没有必要克隆然后合并,成员Copy也会这样做。

我不是专家,但属性Sort of DataView在返回DataTable时对DataView进行排序,因此我们不对任何内容进行排序。