【问题标题】:Cannot understand the mistake in the sorting code无法理解排序代码中的错误
【发布时间】:2010-07-28 22:51:50
【问题描述】:

我最近在一次采访中被问到一个奇怪的问题;

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

这个功能可以正常工作,但是有一个问题(至少面试官声称是这样)。好吧,我不知道它是什么。有什么想法吗?

【问题讨论】:

  • 我认为任何涉及数据表或数据集的面试问题都是一个巨大的警告信号。
  • @richeym 除非他们解决了潜在雇主的问题。每个工具都有用处。
  • @PostMan 令人惊讶的是,您可以使用数据表等“解决”哪些问题。
  • @PostMan,每一次“使用”都有一个驱动需求的“工具”。
  • 你需要在这里阅读一些好的博客我想推荐一个http://explicitcoder.in/for-net-interview/

标签: .net vb.net data-binding


【解决方案1】:

您无缘无故地创建数据表。

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

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 

【讨论】:

  • 重新检查后克隆只是复制数据的结构而不是数据表的数据合并复制数据
  • 已修复,但仍不需要额外的数据表
  • 这样做的一个缺点 - 您实际上是在改变 dt 参数,但将其更改为 DefaultViewDefaultViewDataTable 的内在属性。直接修改它可能会产生意想不到的副作用。
【解决方案2】:

我从未使用过DataViewDataTable,但代码并没有处理对象。

【讨论】:

  • 我认为数据表和数据视图对象可以被释放。
  • 是的,它们可以,我检查过,但它们没有在您提供的代码示例中处理。这可能是面试官正在寻找的答案,除非有一些明显的使用问题。
  • 提供的数据表翻了一番——这是主要问题
  • 刚刚看了一下文档,代码没有意义。克隆对象,然后使用合并方法。我仍然认为处理对象是一个更大的问题。
  • 但是如果你看到我的代码,他们使用谁调用这个方法可能会处理传入的DataTable,因为它不是在方法中创建的,所以在那里处理它会很糟糕。海事组织
【解决方案3】:

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

简而言之..

但是那里发生了什么

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

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

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

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

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

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

您在中间接受的冗余是一个很好的答案,在某些情况下可能是合理的,例如我们只希望这些数据的排序副本用于其他目的。但是不需要先Clone再合并,成员Copy也一样。

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

    • 是值传递的引用类型,dt不是原始对象的副本。
    • @Chris:这是错误的 - 请参阅此处:yoda.arachsys.com/csharp/parameters.html 当您传递 DataTable 而不是 ByRef 时,会创建一个新的存储位置。引用类型只是意味着变量和实际值之间存在一种间接形式
    • @0A0D - 那篇文章不是证明了我的观点吗? “请记住,尽管引用类型变量的值是引用 - 如果两个引用类型变量引用同一个对象,那么通过这两个变量将看到对该对象中数据的更改。”
    • @Chris:不,因为如果你调用 dt = null,它不会使原始 dt 为 null,除非你是 ByRef
    • 是的,但您只是在创建引用的副本,而不是底层对象。通过操作 dt 您正在更改函数外部的 dt,因此它不是副本。这就是为什么克隆语句可能相关的原因?
    猜你喜欢
    • 2019-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多