2008-12-19 36 views
4

我試圖將一個傳統的C#.NET 1.1應用程序帶入現代時代。我們使用DataTables來收集可能是業務對象的集合。用於將DataTable替換爲集合的最佳c#泛型類?

鑑於大多數代碼認爲它正在與DataRow的接口進行交談,那麼泛型集合會爲最不痛苦的轉換做出什麼?

+0

你真的需要這樣做嗎?如果你有一個使用數據表的工作應用程序,你正在談論你的應用程序的重大改寫。 – 2008-12-19 08:41:14

+0

我同意符文,它不像DataTable走了。如果你的應用程序運行不佳,並且你準備好進行重大改寫,那麼這是一個有效的問題。否則,你需要證明改變是正確的。泛型不是一個神奇的子彈。 – jcollum 2009-01-09 16:57:12

回答

7

如果我正確地閱讀你的問題,你問的是哪個容器只是存儲你的業務對象的列表,然後讓你只需枚舉集合,或通過索引選擇。

好,我會考慮尋找到列表<>

,你的方法會接受任何的IList <>(訪問該指數)或的IEnumerable <>(對收集使用foreach循環)

例如

private void PrintAll<T>(IEnumerable<T> items) 
{ 
    foreach(T item in items) 
     Console.WriteLine(item.ToString()); 
} 

現在我可以在使用了IEnumerable <>界面,包括列表<任何容器傳遞>和諾瑪升陣列

例如

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

a sample n-tier app with Buiness objects

HTH

骨頭

3

爲什麼不將DataTable和DataRow分類爲適合您業務邏輯的類型,而不是改變DataSet/DataTable API?

對子類DataRow和DataTable對象的支持非常好。您將在新代碼中獲得所需的強大輸入,以及舊代碼的向後兼容性。此外,您可以在任何需要/需要的地方注入業務邏輯。

+0

我同意。通常我不會再使用類型化數據集,但在這種情況下,它似乎是一個不錯的選擇。 – 2008-12-19 08:39:55

2

如果你是用來DataTable,想必你是用來更改跟蹤和持久性支持,適配器(等)帶來。在這種情況下,您是否考慮過LINQ到SQL和/或實體框架?這些都支持豐富的chaneg跟蹤和自動化持久性,同時提供各種其他DAL用例,如可組合查詢和所有其他LINQ優點。

絕對值得調查。

請注意,更改爲鍵入POCO實體(即不是DataRow或其子類)仍然是一個很大的偏差,因此它不會是一個簡單的更改。如果您沒有時間進行重大改變,堅持使用DataTable(可能鍵入)會很實用。

這將爲您提供EntitySet<T>,IQueryable<T>等,或者您可以使用List<T>,Collection<T>等特殊用法。

1

將「應用程序引入現代時代」的最簡單方法是將代碼從Visual Studio 2003升級到2005或2008。如果您正在尋找向類中添加行爲(「可能是業務對象」),DataSet,DataTable和DataRow作爲部分類實現的事實可以幫助您實現這一點。

上面提到的解決方案對您而言會失去很多東西,包括更改跟蹤,除非您正在尋找 - 這是很大的偏差。 LINQ to SQL,Entity Framework等都提供了變更跟蹤功能,但是在連接到數據庫的工作單元機制中,而不是直接在你的對象上放置工作單元跟蹤,就像DataRow一樣。

希望你不是簡單地改變你的「應用程序進入現代時代」,並且你有一些好處,你試圖獲得你放棄的功能和你花費的努力?

順便說一句,這是假設你正在使用Typed DataSets ...在我看來,對於大多數用途來說,非類型化的DataSet對象是有點愚蠢的。