2012-03-29 16 views
9

बना सकते हैं और एक और सरणी मैं वर्तमान में ऐसा करने के साथ एक सरणी को प्रारंभ करने के लिए:किसी सरणी के साथ सरणी कैसे बनाएं और प्रारंभ करें?

void Foo(int[] a) 
{ 
    int[] b = new int[ a.Length ]; 
    for (int i = 0; i < a.Length; ++i) 
     b[ i ] = a[ i ]; 

    // Other code ... 
} 

वहाँ सी # में ऐसा करने का एक छोटा या अधिक मुहावरेदार रास्ता नहीं है?

यह महान इस एक भी बयान में किया है, तो हो सकता है, सी में की तरह ++ हो जाएगा:

vector<int> b(a); 

यह एक एकल बयान में नहीं किया जा सकता है, तो मैं क्या मैं :-) मिल

ले जाएगा
+2

तुम सिर्फ का उपयोग नहीं किया जा सका 'Array.Copy'? –

+0

सभी मेमोरी को सीधे कॉपी करने का एक तरीका होना चाहिए ... सी ++ में http://stackoverflow.com/questions/3902215/using-memcpy-to-copy-a-range-of-elements-from-an-array –

+0

http: // stackoverflow।कॉम/प्रश्न/5655553/सबसे-कुशल-तरीके-प्रति-प्रति-तत्व-ए-तेज-बहु-आयामी-एआर –

उत्तर

12

मैं इस के लिए LINQ का उपयोग कर पसंद:

int[] b = a.ToArray(); 

कहा जा रहा है, Array.Copy बेहतर प्रदर्शन, इस एक तंग पाश में इस्तेमाल किया जाएगा अगर, आदि है:

int[] b = new int[a.Length]; 
Array.Copy(a, b, a.Length); 

संपादित करें:

यह महान इस एक भी बयान में किया जा सकता है, सी में की तरह ++ हो जाएगा:

वेक्टर ख (क);

इस के सी # संस्करण होगा:

List<int> b = new List<int>(a); 

List<T> है सी # के std::vector<T> के बराबर है। किसी भी IEnumerable<T> साथ constructor above काम करता है, एक और List<T> सहित एक सरणी (T[]), आदि

+0

+1 में सी ++ से वेक्टर बी (ए) के समतुल्य की तलाश में हूं - मैंने इसके लिए LINQ कभी नहीं माना। अच्छा समाधान! –

6

उपयोग Array.Copy एक सरणी

 int[] source = new int[5]; 
    int[] target = new int[5]; 
    Array.Copy(source, target, 5); 
1

कॉपी करने के लिए इसके अलावा डिफ़ॉल्ट Clone() समारोह जो IClonable इंटरफ़ेस से कार्यान्वित किया जाता है की कोशिश करो।

int[] b = a.Clone() as int[]; 
1

क्लोन() और toArray() वाक्य रचना अच्छा है क्योंकि आप एक गंतव्य सरणी पूर्व आवंटित करने के लिए की जरूरत नहीं है रहे हैं, लेकिन प्रदर्शन के मामले में, Array.Copy() सबसे तेजी से विधि (चेतावनी नीचे देखें है)।

Array.Copy() इतनी तेजी से होने का कारण यह है कि यह किसी भी स्मृति को आवंटित नहीं करता है। हालांकि, अगर आपको हर बार स्मृति के नए क्षेत्र में प्रतिलिपि बनाने के लिए अपने सरणी की आवश्यकता होती है, तो Array.Copy() अब सबसे तेज़ तरीका नहीं है।

यहाँ मेरी प्रदर्शन परिणाम हैं:

Copy: 0 ms 
Copy (with allocation): 449 ms 
Clone: 323 ms 
ToArray: 344 ms 

और यहाँ कोड मैं प्रयोग किया जाता है:

const int arrayLength = 100000; 
const int numberCopies = 1000; 
var a = new int[arrayLength]; 
var b = new int[arrayLength]; 

var stopwatch = new Stopwatch(); 
for (var i = 0; i < numberCopies; i++) { 
    Array.Copy(a, b, arrayLength); 
} 
Console.WriteLine($"Copy: {stopwatch.ElapsedMilliseconds} ms"); 

stopwatch.Restart(); 
for (var i = 0; i < numberCopies; i++) { 
    var c = new int[arrayLength]; 
    Array.Copy(a, c, arrayLength); 
} 
Console.WriteLine($"Copy (with allocation): {stopwatch.ElapsedMilliseconds} ms"); 

stopwatch.Restart(); 
for (var i = 0; i < numberCopies; i++) { 
    b = (int[]) a.Clone(); 
} 
Console.WriteLine($"Clone: {stopwatch.ElapsedMilliseconds} ms"); 

stopwatch.Restart(); 
for (var i = 0; i < numberCopies; i++) { 
    b = a.ToArray(); 
} 
Console.WriteLine($"ToArray: {stopwatch.ElapsedMilliseconds} ms"); 
संबंधित मुद्दे