2009-02-05 7 views
6

मैंक्या दो बिटएरे (सी # .NET) को संयोजित करने का कोई आसान तरीका है?

var previous = new BitArray(new bool[]{true}); 
var current = new BitArray(new bool[]{false}); 

मैं उन्हें श्रेणीबद्ध करना चाहते हैं। मैंने पहले से ही कोशिश की है:

var next = new BitArray(previous.Count + current.Count); 
var index = 0; 
for(;index < previous.Count; index++) 
    next[index] = previous[index]; 
var j = 0; 
for(;index < next.Count; index++, j++) 
    next[index] = current[j]; 
previous = current; 

लेकिन यह ऐसा करने का सबसे अच्छा तरीका नहीं दिखता है।

उत्तर

7

दुर्भाग्य से यह आपके विधि की तरह के रूप में यह हो जाता है के रूप में अच्छा हो सकता है लगता है - अगर BitArray IEnumerable < टी > कार्यान्वित (के बजाय सिर्फ IEnumerable की) तो हम LINQ विस्तार तरीकों का उपयोग कर सकता है यह थोड़ा खूबसूरत बनाने के लिए।

अगर मैं तुम्हें थे, मैं इस ऊपर एक विस्तार विधि में BitArray पर लपेट चाहते हैं:

public static BitArray Prepend(this BitArray current, BitArray before) { 
    var bools = new bool[current.Count + before.Count]; 
    before.CopyTo(bools, 0); 
    current.CopyTo(bools, before.Count); 
    return new BitArray(bools); 
} 

public static BitArray Append(this BitArray current, BitArray after) { 
    var bools = new bool[current.Count + after.Count]; 
    current.CopyTo(bools, 0); 
    after.CopyTo(bools, current.Count); 
    return new BitArray(bools); 
} 
+2

हैं आप जानते हैं कि पहले सरणी में 32 बिट्स का एक से अधिक गुण होता है, आप बूल सरणी के बजाय int arrays का उपयोग करके इसे महत्वपूर्ण रूप से अनुकूलित कर सकते हैं। CopyTo int [], bool [] और बाइट [] –

2

ढांचा ऐसा करने का एक अच्छा तरीका प्रदान नहीं करता है। आप उन बूलों की एक सरणी बना सकते हैं जो बिट्सरेज़ दोनों को स्टोर करने के लिए पर्याप्त हैं। फिर BitArray का उपयोग करें। Bopys की प्रत्येक सरणी में प्रत्येक बिटएरे को कॉपी करने के लिए कॉपी करें (आप निर्दिष्ट कर सकते हैं कि तत्व कहां डालना शुरू करें)।

ऐसा करने के बाद, कन्स्ट्रक्टर के साथ एक और बिटरायर बनाएं जो बूल की सरणी स्वीकार करता है।

मुझे बहुत सारे काम पता है, लेकिन ऐसा कोई दूसरा तरीका प्रतीत नहीं होता है। हालांकि यह आपकी वर्तमान विधि से कम कोड है।

5

एक LINQ के साथ ऐसा कर सकते हैं, के बाद Cast<bool>() bitarray 'बन जाता है' IEnumerable<bool>:

var previous = new BitArray(new bool[] { true }); 
var current = new BitArray(new bool[] { false }); 

BitArray newBitArray = 
    new BitArray(previous.Cast<bool>().Concat(current.Cast<bool>()).ToArray()); 

मुझे नहीं लगता कि इस LINQ विधि तेजी से हो जाएगा।

-1

यदि आप bools के बजाय int32 का उपयोग करते हैं तो यह अधिक कुशल है क्योंकि बिटरैरे आंतरिक रूप से int32 का उपयोग करता है।

public static BitArray Append(this BitArray current, BitArray after) { 
    var ints = new int[(current.Count + after.Count)/32]; 
    current.CopyTo(ints, 0); 
    after.CopyTo(ints, current.Count/32); 
    return new BitArray(ints); 
} 

Vb.net में किसी को भी यह की जरूरत है:

<Runtime.CompilerServices.Extension()> _ 
Public Function Append(ByVal current As BitArray, ByVal after As BitArray) As BitArray 
    Dim ints = New Int32((current.Count + after.Count) \ 32 - 1) {} 
    current.CopyTo(ints, 0) 
    after.CopyTo(ints, current.Count \ 32) 
    Return New BitArray(ints) 
End Function 
+2

के साथ काम करता है यह कोड केवल तभी काम करता है जब दोनों आने वाले बिट सरणी में लम्बाई होती है जो 32 के गुणक होते हैं - अन्यथा आप 32 राउंड के पूर्णांक विभाजन के बाद सीमा अपवाद से बाहर निकलते हैं , 'इन्ट्स' बहुत छोटा बनाते हैं। 'इनट्स' को लंबे समय तक बनाना पर्याप्त नहीं है, क्योंकि जब तक 'वर्तमान' लंबाई 32 का एक से अधिक नहीं है, तब तक संलग्न सरणी मध्य में अप्रयुक्त बिट्स छोड़ देगी, जो संभवतः कोई नहीं चाहता है। –

+0

अच्छा विचार, लेकिन @ क्रिस्टियन वेडबर्ग का उल्लेख है कि यह केवल कुछ (दुर्लभ) स्थितियों के तहत काम करेगा। – larsmoa

0

यहाँ है मेरी LINQ कार्यान्वयन जो bools की एक सरणी आवंटित करने के लिए होने की भूमि के ऊपर शामिल नहीं है:

var result = new BitArray(first.Count + second.Count); 

var i = 0; 
foreach (var value in first.Cast<bool>().Concat(second.Cast<bool>())) 
{ 
    result[i++] = value; 
}