【问题标题】:DataTables vs IEnumerable<T>数据表与 IEnumerable<T>
【发布时间】:2009-05-22 03:25:58
【问题描述】:

我正在和我一起工作的另一个程序员争论。

对于数据库返回类型,是否存在任何显着的内存使用或性能差异,或其他应避免使用 DataSets 和 DataTables 并偏爱实现 IEnumerable&lt;T&gt;... 或反之亦然的类型的缺点

我更喜欢返回实现IEnumerable&lt;T&gt; (List&lt;T&gt;, T[] etc) 的类型,因为它更轻量级,在访问属性时对对象进行强类型化,允许有关底层类型的更丰富的信息等。虽然它们确实需要更多时间来设置手动使用数据阅读器。

现在使用 DataTables 的唯一原因是懒惰吗?

【问题讨论】:

  • 平台/语言?我猜 DataTable 是一个特定于平台的结构;但明确表示更容易回答
  • 没错,平台是.Net Framework (c# or vb) 2.0+
  • 我认为自 2009 年以来我没有使用过 DataTable,它们很烂
  • 是否可以通过使用 ado.net 执行“从表中选择 *”来填充 T[]??
  • @Learning-Overthinker-Confused 是的,但您需要调用 SqlCommand.ExecuteReader 并使用 IDataReader 读取记录

标签: c# list datatable ienumerable


【解决方案1】:

无论是在内存需求方面,还是在创建/填充它们所花费的处理器时间方面,数据表肯定比列表重得多。
使用 DataReader 比使用 DataTables 快得多(虽然更冗长)(我假设您使用 DataAdapter 来填充它们)。

也就是说…… 除非这是在某个真正很重要的地方,否则你可能都很好,而且这两种方法都足够快,所以在每种情况下都可以选择更舒服的方法。 (有时你想用很少的代码填满它们,有时你想用很少的代码来阅读它们)

我自己倾向于只在绑定到 GridView 时使用 DataTables,或者当我需要同时激活多个结果集时。

【讨论】:

    【解决方案2】:

    使用 System.Collections 类的另一个优点是您可以获得更好的排序和搜索选项。我不知道有什么合理的方法可以改变 DataTable 的排序或搜索方式;使用集合类,您只需让您的类实现 IComparable 或 IEquatable,您就可以完全自定义 List.Sort 和 List.Contains 的工作方式。

    此外,对于列表,您不必担心 DBNull,它不止一次让我绊倒,因为我期待 null 并得到 DBNull。

    【讨论】:

    • 使用 DataView 进行排序和搜索。
    【解决方案3】:

    我也喜欢IEnumerable&lt;T&gt; 的事实,即您可以使用方法和属性增强集合的底层类型,这使得实现更加优雅,代码更易于维护。例如 FullName 属性。如果您无法控制,您还可以向该类添加扩展方法。

    public class SomeUser
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string FullName { get { return String.Format("{0} {1}", FirstName, LastName); } }
    }
    

    【讨论】:

      【解决方案4】:

      直接使用 DataTables 意味着将自己与底层数据源及其布局方式联系起来。从可维护性的角度来看,这并不好。如果您的视图需要的只是一些对象的列表,那么您应该给它。

      【讨论】:

        【解决方案5】:

        我发现通过 sql 使用大表,数据表比 IEnumerable 快得多。我在一个 HTML 页面中转储了一个包含 26k 行和 25 列的表。数据表用了 3 秒,IEnumerable 用了 9 秒。我投票给数据表。除了类型之外,所有代码都相同。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-11-16
          • 1970-01-01
          • 1970-01-01
          • 2011-08-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多