2016-03-21 10 views
0

Ich möchte ein String-Array mit Werten von Namen und einigen Zahlen (die Strings sind) Ich möchte sie in eine Funktion übergeben, die das Array nehmen und dann in teilen ein Objekt gezackten Array (1 Array von Strings und 1-Array von ints)
das Array:Split ein String-Array zu einem gezackten Objekt-Array

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

und die Funktion sieht wie folgt aus:

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

} 

was als nächstes?

+9

Nächster Schritt: Sie zeigen uns, was Sie versucht haben. – Noctis

+0

http://pastebin.com/DHPRuDTu – N3wbie

Antwort

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

Es scheint, dass Sie * zu viele Elemente * mit 'neues Objekt [bstr.Length] zugewiesen haben '; Das ist der Grund, warum Tail-Items von 'bloop'' null's sind –

+0

Ja, Sie haben recht, wir können nicht vorhersagen, wie viele Strings/Integer es gibt, wir können dies vermeiden, indem wir Generic Collections/List und Auto Increment fähige Arrays verwenden . –

3

Ihr Szenario sieht wie ein schlechtes Design aus, das zu Fehlern und Leistungsproblemen führen kann. Der bessere Weg ist, Code für die Verwendung von generischen List<> oder etwas ähnliches zu ändern. Aber in Ihrem aktuellen Problem können Sie unten Code verwenden:

0

Ich stimme zu, dass Ihre Anforderung seltsam klingt und sollte mit einem anderen Ansatz gelöst werden. Allerdings wird dies tun, was Sie wollen:

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 }; 
} 

Ihr Beispiel:

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

Wenn Sie das zweite Array als int[] benötigen könnten Sie folgendes:

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

das war meine Lösung: http://pastebin.com/DHPRuDTu aber hat nicht funktioniert – N3wbie

0

Linq Lösung .

Sie haben zwei Gruppen: Erstens hat man Elemente, die int und die zweite Gruppe analysiert werden kann, enthält alle anderen, so GroupBy sieht ganz natürlich:

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(); 
} 

Test:

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)))); 
Verwandte Themen