2013-04-04 2 views
5

मेरे पास DataTables का एक गुच्छा है जिसे object[,] सरणी में परिवर्तित करने की आवश्यकता है (object[][] सरणी)। प्रदर्शन के संदर्भ में ऐसा करने का सबसे प्रभावी तरीका क्या है?डेटाटेबल को किसी ऑब्जेक्ट में कनवर्ट करने का सबसे प्रभावी तरीका क्या है [,]?

मुझे पता है कि मैं अपनी object[dt.Rows.Count, dt.Columns.Count] को प्रारंभ में, फिर पंक्तियों के माध्यम से लूपिंग और सरणी में किसी स्थान पर प्रत्येक पंक्ति को पार्स करके इसे कर सकता हूं, लेकिन मुझे पूरा यकीन है कि लिंक या सिस्टम का उपयोग करने जैसी अन्य विधियां हैं। डेटा-विशिष्ट dataRow.ToItemArray() जैसी विशेषताएं जो अधिक कुशल हो सकती हैं।

मेरा DataTables परिवर्तनीय आकार के हैं, और दोनों तिथियां और संख्याएं हैं जिन्हें तारों के अलावा उचित रूप से प्रारूपित करने की आवश्यकता है।

उदाहरण के लिए

, अगर अपनी डेटा तालिका में से एक निहित

 
Id Name Date     Value 
1  Rachel 1/1/2013 00:00:00 100.0000 
2  Joseph 3/31/2012 00:00:00 50.0000 
3  Sarah 2/28/2013 00:00:00 75.5000 

तो मैं ठीक उसी डेटा वाली (आदर्श हेडर के साथ) एक object[,] सरणी चाहेगा, लेकिन स्वरूपित तिथियां साथ और मूल्य

arr[x,0] = row[x].Field<int>("Id"); 
arr[x,1] = row[x].Field<string>("Name"); 
arr[x,2] = row[x].Field<DateTime>("Date").ToString("M/d/yy"); 
arr[x,3] = row[x].Field<decimal>("Value").ToString("C2"); // Currency format 
+4

LINQ का उपयोग जादुई चीज़ों को गति नहीं है। –

+0

"अधिक कुशल" द्वारा, क्या आप अपने एल्गोरिदम की समय जटिलता में सुधार करना चाहते हैं (जैसे ओ (एन^2) से ओ (एन)), या केवल स्थिर कारक सुधार? – mbeckish

+1

आप अपनी पोस्ट में 'पहले' और 'बाद' डेटा क्यों शामिल नहीं करते? –

उत्तर

8

असल में हम की जरूरत है:

  1. 012 के लिए स्मृति का आवंटन

    हम यहां बहुत कुछ नहीं कर सकते हैं .. हमें यह सुनिश्चित करने की ज़रूरत है कि हम एक बार स्मृति आवंटित करें और इसे फिर से आवंटित न करें। तो यह स्पष्ट है कि हमें List.Add(...) जैसे संचालन का उपयोग किए बिना, एक बार में सरणी बनाने की आवश्यकता है जो आंतरिक रूप से स्मृति ब्लॉक को आवंटित करता है।

  2. फिर, हमें पंक्ति वस्तुओं से वस्तुओं को बहुआयामी सरणी में कॉपी करने की आवश्यकता है। हम वस्तुओं के साथ काम करते समय Buffer.BlockCopy का उपयोग नहीं कर सके। स्वाभाविक रूप से हम किसी भी memcpy पर व्यवहार पर निर्भर नहीं हो सकते हैं, क्योंकि प्रत्येक ऑब्जेक्ट के लिए सीएलआर या तो इसके संदर्भ की प्रतिलिपि बनाने की आवश्यकता है, या मूल्य प्रकारों के लिए बॉक्स में हेप-> बॉक्स में कॉपी करें। तो, सबसे आसान तरीका .. के लिए .. शैली के लिए होगा।

तो, सबसे प्रदर्शन समाधान की तरह दिखता है यहां सहज ज्ञान युक्त एक है:

public static object[,] Convert(DataTable dt) 
{ 
    var rows = dt.Rows; 
    int rowCount = rows.Count; 
    int colCount = dt.Columns.Count; 
    var result = new object[rowCount, colCount]; 

    for (int i = 0; i < rowCount; i++) 
    { 
     var row = rows[i]; 
     for (int j = 0; j < colCount; j++) 
     { 
      result[i, j] = row[j]; 
     } 
    } 

    return result; 
} 
संबंधित मुद्दे

 संबंधित मुद्दे