Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将DataTable替换为集合的最佳c泛型类?_C#_.net_Generics_Datatable - Fatal编程技术网

C# 将DataTable替换为集合的最佳c泛型类?

C# 将DataTable替换为集合的最佳c泛型类?,c#,.net,generics,datatable,C#,.net,Generics,Datatable,我正试图将遗留的C.NET1.1应用程序带入现代时代。我们使用数据表来收集可能是业务对象的内容 鉴于大多数代码都认为它是在与DataRow的接口进行通信,那么什么样的泛型集合可以使转换最轻松?与其改变DataSet/DataTable API,不如将DataTable和DataRow子类化为适合您的业务逻辑的类型 对子类DataRow和DataTable对象的支持非常好。您将在新代码中获得所需的强类型,以及旧代码的向后兼容性。此外,您可以在任何需要/需要的地方注入业务逻辑。如果我正确地阅读了您的

我正试图将遗留的C.NET1.1应用程序带入现代时代。我们使用数据表来收集可能是业务对象的内容


鉴于大多数代码都认为它是在与DataRow的接口进行通信,那么什么样的泛型集合可以使转换最轻松?

与其改变DataSet/DataTable API,不如将DataTable和DataRow子类化为适合您的业务逻辑的类型


对子类DataRow和DataTable对象的支持非常好。您将在新代码中获得所需的强类型,以及旧代码的向后兼容性。此外,您可以在任何需要/需要的地方注入业务逻辑。

如果我正确地阅读了您的问题,那么您需要的是哪个容器将只存储业务对象的列表,然后允许您仅枚举整个集合,或通过索引进行选择

我想考虑一下清单

方法将接受IList来访问索引,或者接受IEnumerable来在集合上使用foreach循环

比如说

private void PrintAll<T>(IEnumerable<T> items)
{
    foreach(T item in items)
        Console.WriteLine(item.ToString());
}
现在我可以传入任何使用IEnumerable接口的容器,包括List和normal数组

范例

List<Person> people = new List<Person>();
//add some people to the list
PrintAll<Person>(people);

bones

如果您习惯使用DataTable,那么您可能已经习惯了适配器等带来的更改跟踪和持久性支持。在这种情况下,您是否考虑过LINQ到SQL和/或实体框架?它们都支持丰富的通道跟踪和自动持久性,同时提供各种其他DAL用例,如可组合查询和所有其他LINQ功能

绝对值得调查

请注意,更改为类型化POCO实体,即不是DataRow,也不是DataRow的子类,仍然存在很大的偏差,因此这不是一个简单的更改。如果您没有时间进行重大更改,那么坚持使用DataTable(可能是键入的数据表)将是务实的


这将为您提供EntitySet、IQueryable等,或者您可以使用List、Collection等进行临时使用。

将应用程序带入现代时代的最简单方法是将代码从Visual Studio 2003升级到2005或2008。如果您希望向类中添加可能是业务对象的行为,那么DataSet、DataTable和DataRow作为部分类实现的事实会让您明白这一点

上面提到的解决方案会给您带来很多损失,包括更改跟踪,除非您希望在很大程度上偏离这一点。LINQ到SQL、实体框架等都提供了更改跟踪,但都是在工作单元机制内,用于连接到db,而不是像DataRow那样将工作单元跟踪直接放在对象上

希望您不是为了将应用程序带入现代时代而进行简单的更改,并且希望您能够从放弃的功能和付出的努力中获得一些好处


顺便说一下,这都是假设您使用的是类型化数据集。。。在我看来,非类型化数据集对象在大多数情况下都有点傻。

我同意。另外,使用一个列表或任何实现IEnumerable的对象也允许使用Linq语法,当然,如果他正在升级到一个足够新的框架版本,我同意。通常我不会再使用类型化数据集,但在这种情况下,这似乎是一个不错的选择。如果您升级到VS2005或2008,您实际上不需要对类型化DS进行子类化。。。您可以简单地使用生成的DS、DT或DR的部分类。您真的需要这样做吗?如果你有一个使用datatables的工作应用程序,你说的是对你的应用程序的重大重写。我同意Rune的观点,DataTable并没有消失。如果您的应用程序运行不好,并且您已经准备好进行重大重写,那么这是一个有效的问题。否则,您需要证明更改的合理性。仿制药不是灵丹妙药。