DataTables与IEnumerable <T>

CRi*_*ice 21 c# datatable ienumerable list

我正在与我合作的另一位程序员进行辩论.

对于数据库返回类型,是否有任何重要的内存使用或性能差异,或其他缺点应该使某人避免使用DataSet和DataTables并支持实现的类型IEnumerable<T>...反之亦然

我更喜欢返回实现IEnumerable<T>(List<T>, T[] etc)的类型,因为它更轻量级,在访问属性时强烈地键入对象,允许有关底层类型的更丰富信息等.当手动使用数据读取器时,它们确实需要更多时间来设置.

这几天使用DataTables的唯一理由就是懒惰吗?

Dan*_*ola 21

DataTables肯定比Lists重得多,无论是在内存需求方面,还是在创建它们/填充它们的处理器时间方面.
使用DataReader比使用DataTables(我假设您使用DataAdapter来填充它们)要快得多(尽管更冗长).

那就是说......除非这个地方真正重要,否则你可能都很好,两种方法都足够快,所以在每种情况下都可以选择更舒适的方法.(有时你想用很少的代码填充它们,有时你想用很少的代码读它们)

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


Joh*_*ant 10

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

还有列表你不必担心DBNull,因为我期待null并获得DBNull,因此不止一次使我失望.

  • 使用DataView进行排序和搜索. (3认同)

CRi*_*ice 8

我也喜欢这样的事实IEnumerable<T>:您可以使用方法和属性来增强集合的基础类型,这使得实现更加优雅,并且代码更易于维护.例如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); } }
}
Run Code Online (Sandbox Code Playgroud)


Jam*_*ney 6

直接使用DataTable意味着将自己与基础数据源及其布局方式联系起来.从可维护性的角度来看,这并不好.如果你的所有视图需求都是一些对象的列表,那就是你应该给它的全部内容.