2016-03-21 20 views
0

Dizin dizisini isimleri ve bazı sayılarla (dizeleri olan) bir dizi dizi yapmak istiyorum Onları diziye alacak bir işleve aktarmak ve sonra daBir dize dizisini pürüzlü bir nesne dizisine bölme

string[] str= { "toto", "the", "moto", "my", "friend","12","13","14","99","88"}; 

ve fonksiyon şöyle: bir nesne pürüzlü dizi (dizeleri 1 dizisi ve ints 1 dizisi)
dizidir sonraki ne

public object[][] bloop (string[] bstr) 
{ 

} 

?

+9

Sonraki adım: Bize neyi denediğinizi gösterin. – Noctis

+0

http://pastebin.com/DHPRuDTu – N3wbie

cevap

0
public static object[][] bloop(string[] bstr) 
    { 
     object[][] result = new object[2][] { new object[bstr.Length], new object[bstr.Length] }; 
     int sFlag = 0, iFlag = 0, val;    
     foreach (string str in bstr) 
      if (int.TryParse(str, out val)) 
       result[1][iFlag++] = val; 
      else 
       result[0][sFlag++] = str; 
     return result; 
    } 
+0

Bu yeni nesne ile çok fazla öğe * ayırdığınız gibi görünüyor [bstr.Length] '; Bu yüzden 'bloop' un kuyruk öğeleri sıfır olacak –

+0

Evet, haklısınız, kaç tane dizginin/tamsayıların olacağını tahmin edemeyiz, bu genel koleksiyonları/Liste ve Otomatik Arttırma yetenekli dizileri kullanarak bunu önleyebiliriz . –

3

Senaryonuz, hatalara ve performans sorunlarına neden olabilecek kötü bir tasarıma benziyor. Daha iyi bir yol, jenerik List<>'u veya bunun gibi bir şeyi kullanmak için kodu değiştirmektir. Ama mevcut problemde kod aşağıda kullanabilirsiniz:

public object[][] bloop (string[] bstr) 
{ 
    var numbers = new List<int>(); 
    var strings = new List<string>(); 
    var result = new object[2][]; 

    foreach(var str in bstr) 
    { 
     int number = 0; 
     if(int.TryParse(str, out number)) 
     { 
      numbers.Add(number); 
     } 
     else 
     { 
      strings.Add(str); 
     } 
    } 

    result[0] = strings.ToArray(); 
    result[1] = numbers.ToArray(); 

    return result; 
} 
0

Kabul ediyorum senin gereksinimi garip sesler ve farklı bir yaklaşımla çözülmesi gerektiğini söyledi. Ancak, bu ne istediğinizi yapacak:

public T[][] Bloop<T>(T[] items) 
{ 
    if (items == null) throw new ArgumentNullException("items"); 
    if (items.Length == 1) return new T[][] { items, new T[] { } }; 

    int firstLength = (int) Math.Ceiling((double)items.Length/2); 
    T[] firstPart = new T[firstLength]; 
    Array.Copy(items, 0, firstPart, 0, firstLength); 
    int secondLength = (int)Math.Floor((double)items.Length/2); 
    T[] secondPart = new T[secondLength]; 
    Array.Copy(items, firstLength, secondPart, 0, secondLength); 
    return new T[][] { firstPart, secondPart }; 
} 

Sizin örnek:

string[] str= { "toto", "the", "moto", "my", "friend","12","13","14","99","88"}; 
string[][] result = Bloop(str); 

Eğer int[] olarak ikinci dizi gerekiyorsa aşağıdaki kullanabilirsiniz:

int[] ints = Array.ConvertAll(result[1], int.Parse); 
+0

bu benim çözümümdü: http://pastebin.com/DHPRuDTu ama işe yaramadı – N3wbie

0

Linq çözümü .

Sen iki grubu vardır: Birincisi int ayrıştırıldı ve ikinci grup diğerlerini içeren edilebilir öğeleri, böylece GroupBy oldukça doğal görünüyor vardır:

public Object[][] bloop(string[] bstr) { 
    if (null == bstr) 
    throw new ArgumentNullException("bstr"); 

    int v; 

    return bstr 
    .GroupBy(x => int.TryParse(x, out v)) 
    .OrderBy(chunk => chunk.Key) // let strings be the first 
    .Select(chunk => chunk.ToArray()) 
    .ToArray(); 
} 

Testi:

string[] str = { "toto", "the", "moto", "my", "friend", "12", "13", "14", "99", "88" }; 

// toto, the, moto, my, friend 
// 12, 13, 14, 99, 88 
Console.Write(String.Join(Environment.NewLine, 
    bloop(str).Select(x => String.Join(", ", x)))); 
İlgili konular