2013-09-24 8 views
16

मेरे पास बाइट्स की एक सूची है और मैं इस सूची को छोटे भागों में विभाजित करना चाहता हूं।सी #: एन भागों में एक सरणी को विभाजित करना

var array = new List<byte> {10, 20, 30, 40, 50, 60}; 

इस सूची में 6 सेल्स हैं। उदाहरण के लिए, मैं इसे प्रत्येक 3 बाइट युक्त 3 भागों में विभाजित करना चाहता हूं।

मैंने कुछ उद्देश्यों को लिखने की कोशिश की है और मेरे उद्देश्य को प्राप्त करने के लिए 2 डी सरणी का उपयोग किया है, लेकिन मुझे नहीं पता कि यह एक सही दृष्टिकोण है।

  byte[,] array2D = new byte[window, lst.Count/window]; 
      var current = 0; 
      for (int i = 0; i < rows; i++) 
      { 
       for (int j = 0; j < cols; j++) 
       { 
        array2D[i, j] = lst[current++]; 
       } 
      } 
+0

आपके कोड के बारे में कैसे? ऐसा लगता है कि यह काम करता है, हालांकि 'पंक्तियों' और 'कोल्स' अभी भी अस्पष्ट हैं। 'पंक्तियां' 'विंडो 'होनी चाहिए और' cols'' lst.Count/window' होना चाहिए। –

+0

अधिकlinq बैच का उपयोग करें https://code.google.com/p/morelinq/source/browse/MoreLinq/Batch.cs –

उत्तर

33

किसी भी सरणी को विभाजित करने के लिए एक सामान्य/विस्तार विधि बनाने का एक अच्छा तरीका होगा। यह मेरा है:

/// <summary> 
/// Splits an array into several smaller arrays. 
/// </summary> 
/// <typeparam name="T">The type of the array.</typeparam> 
/// <param name="array">The array to split.</param> 
/// <param name="size">The size of the smaller arrays.</param> 
/// <returns>An array containing smaller arrays.</returns> 
public static IEnumerable<IEnumerable<T>> Split<T>(this T[] array, int size) 
{ 
    for (var i = 0; i < (float)array.Length/size; i++) 
    { 
     yield return array.Skip(i * size).Take(size); 
    } 
} 

इसके अलावा, यह समाधान स्थगित कर दिया गया है। फिर, बस अपने सरणी पर split(size) पर कॉल करें।

var array = new byte[] {10, 20, 30, 40, 50}; 
var splitArray = array.Split(2); 

के रूप में अनुरोध किया है, यहाँ एक सरणी से एक वर्ग 2 डी सरणियों प्राप्त करने के लिए एक सामान्य/विस्तार विधि है:

public static T[,] ToSquare2D<T>(this T[] array, int size) 
{ 
    var buffer = new T[(int)Math.Ceiling((double)array.Length/size), size]; 
    for (var i = 0; i < (float)array.Length/size; i++) 
    { 
     for (var j = 0; j < size; j++) 
     { 
      buffer[i, j] = array[i + j]; 
     } 
    } 
    return buffer; 
} 

है मज़ा :)

+0

"के साथ" GetRange (i, size) "को प्रतिस्थापित करने की आवश्यकता है ** यह ** ** ओपी ** की वांछित डेटा संरचना को पूरी तरह बदलता है ** **। वह 'वर्ग 2 डी सरणी' चाहता है। –

+0

वास्तव में नहीं। उनका 'स्क्वायर 2 डी एरे' एक ऐसा दृष्टिकोण है जिसने इस मुद्दे को हल करने की कोशिश की, वह नहीं जो वह प्राप्त करना चाहता था। 'IENumerable > का उपयोग करना 'बहुत अधिक लचीला है। – ZenLulz

+0

बेशक मैं 'आईनेमेरेबल स्टफ' या 'लिस्ट स्टफ' जैसी चीज़ों के लिए जाऊंगा। लेकिन ऐसा लगता है कि ओपी क्या चाहता है। आप इतना यकीन नहीं कर सकते हैं। वास्तव में यदि आप 'मैट्रिक्स' के साथ कुछ गणना करते हैं, तो 'वर्ग 2 डी सरणी' का उपयोग करना बेहतर होगा। –

8

Linq

public List<List<byte>> SplitToSublists(List<byte> source) 
{ 
    return source 
      .Select((x, i) => new { Index = i, Value = x }) 
      .GroupBy(x => x.Index/100) 
      .Select(x => x.Select(v => v.Value).ToList()) 
      .ToList(); 
} 

का उपयोग कर, बस का उपयोग यह

var sublists = SplitToSublists(lst); 
0

आप इस एक कोशिश देने के लिए चाहते हो सकता है।

var bytes = new List<byte>(10000); 
int size = 100; 
var lists = new List<List<byte>>(size); 
for (int i = 0; i < bytes.Count; i += size) 
{ 
     var list = new List<byte>(); 
     list.AddRange(bytes.GetRange(i, size)); 
     lists.Add(list); 
} 
+1

यह विफल रहता है और सीमा से बाहर चला जाता है; आपको "GetRange (i, size)" को "GetRange (i, Math.Min (आकार, बाइट्स.काउंट - i))" – Dan

0

यहाँ मेरी नैफ समाधान:

public static string[] SplitArrey(string[] ArrInput, int n_column) 
    { 

     string[] OutPut = new string[n_column]; 
     int NItem = ArrInput.Length; // Numero elementi 
     int ItemsForColum = NItem/n_column; // Elementi per arrey 
     int _total = ItemsForColum * n_column; // Emelemti totali divisi 
     int MissElement = NItem - _total; // Elementi mancanti 

     int[] _Arr = new int[n_column]; 
     for (int i = 0; i < n_column; i++) 
     { 
      int AddOne = (i < MissElement) ? 1 : 0; 
      _Arr[i] = ItemsForColum + AddOne; 
     } 

     int offset = 0; 
     for (int Row = 0; Row < n_column; Row++) 
     { 
      for (int i = 0; i < _Arr[Row]; i++) 
      { 
       OutPut[Row] += ArrInput[i + offset] + " "; // <- Here to change how the strings are linked 
      } 
      offset += _Arr[Row]; 
     } 
     return OutPut; 
    } 
संबंधित मुद्दे