2012-09-16 77 views
0

在Javascript,AS3和Python等默認支持並推薦無類型數據數組的平臺中,數組通常是將任意用戶數據存儲在內存中的最簡單也是最有效的方式。 (表格數據,來自CSV的數據,來自JSON的數據等)將MySQL或JSON數據存儲在內存中的有效方法?

但是,.NET以喜歡強類型的格式喜歡所有東西;你不能將任何東西轉儲到數組中,雖然它可以工作,但它處理起來會更慢更笨拙(類型檢查,類型轉換每種用法)。所以通常你最終將數據模式定義爲一個類,其屬性對應於列,並將數據存儲在該類的實例中。

那麼什麼是在內存中存儲任意數據的推薦方法,特別是當模式不斷升級(例如CSV或JSON)時,在開發時您無法「硬編碼」。這些數據可能包括數字(int/float),字符串,日期,時間,單位,地理空間數據,幾何數據,嵌入式文件,基本上是MySQL數據庫或JSON文件可以存儲的所有內容。

編輯:在內存中,這些數據可以並且將用於每種類型的處理;用於生成圖表的計算,用於通過子字符串搜索數據的字符串處理,用於地理空間/ 3D數據的數字運算算法等,用於驗證髒數據和優化冗餘數據的優化算法等。

+0

存儲它之後需要對數據做些什麼? –

+0

你問關於存儲對象數組,然後當你得到一個答案你評論,但如何比較靜態定義類。問題是什麼? – Paparazzi

+0

請記住,這些類型應該是你的朋友(幫助守護代碼的正確性),而不是敵人(給模式更新等問題)。首先,關注你的問題,定義類型,然後考慮如何存儲它們。 – Bartosz

回答

1

可能有幾種方法可以去這裏。

您可以通過反射以編程方式創建類。

How to dynamically create a class in C#?

然後使用泛型集合有些LINQ到對象來查詢數據。或者,您可以使用或創建自己的數據源或數據表,從任何數據源中隨時隨地創建您喜歡的類型,具體取決於您的邏輯,如果其數據庫可以檢查數據表的列類型。然後,您可以使用datatable對象的select方法查詢數據表。

2

它使用的一種可能的方法Dictionary<string,object>或考慮(4.0+)使用動態對象來存儲單個項目。再次將項目放入List或Array或Dictionary。

在以太情況下,您還可能需要某種關於對象的元數據。即屬性名稱爲{類型,限制,驗證規則,其他任何}映射。

+0

這不會有性能問題嗎?動態對象可以像靜態定義的類一樣快速地工作?顯然反射/ IL生成可以用來在運行時定義類及其屬性,儘管它有點棘手。 –

+1

@Geotarget,everysthing比'inc eax'慢。它是否足夠快 - 您可以嘗試測量。如果有任何特定方法對您的情況更好,這裏沒有人能夠提供建議。 –

2

我不同意這個問題中的一些陳述。

首先,「您不能在object[]中轉儲任何東西」。假!您可以在object[]中轉儲任何內容,因爲所有內容都是對象。您只能將其轉換回任何您需要的內容。

二,「速度較慢」。再次錯誤!只要您知道在哪裏尋找,普通舊數組就是訪問速度最快的數據集。它需要O(1)訪問數組中的特定元素。

如果你需要存儲在CSV C#類,你可以想想System.Data.DataTable但最通用的絕對是object[],在它的每個元素都可以成爲自己另一object[]達到你想要的深度級別。

如果你真的需要隨機存取你必須去Dictionary<string,object>由阿列克謝

編輯說:這裏有一個例子

void ScanCollection(object[] collection) 
{ 
    foreach (object item: collection) 
    { 
     if (item is string) 
     ///Treat as string 
     else if (item is float) 
     ///Treat as float 
     else if (item is SomethingElse) 
     ///Treat as SomethingElse class 

    } 
} 
+0

對不起,我談論過對象[]',因爲它不太實用,因爲它幾乎是不可變的(你不能調整它的大小或輕鬆地添加/刪除元素) –

+0

也許列表可能有幫助嗎? –

1

你上哪兒去了對象的數組無法在.NET ?

由於一個對象只支持5種方法,所以沒有太多的肉。

Object Members

所有集合支持對象,據我所知。

List<Object> lObjs = new List<object>(); 
    HashSet<Object> hObjs = new HashSet<object>(); 
    Dictionary<int, Object> dObjs = new Dictionary<int, object>(); 
    Object[] aObjs = new Object[10]; 

    aObjs[0] = "string"; 
    aObjs[1] = 1d; 
    aObjs[2] = new object(); 
相關問題