2016-01-30 2 views
1

Моя функция должна разделять строку на «&» «;» и "," и вернуть тройной зубчатый массив и наоборот. (Из данных типа: 1,2,3; 4,5,6 & 1,2,3; 4,5,6)C# Копирование зубчатых массивов в строки

Я изо всех сил старался заставить его работать, теперь по какой-то причине я ' м получение System.ArgumentNullException на

Array.Copy(playerOneEnts, allEnts[0], playerOneEnts.Length); 
Array.Copy(playerTwoEnts, allEnts[1], playerTwoEnts.Length); 

Полный код:

public string convertToString(string[][][] allEnts) 
{ 
    string Player = string.Empty; 
    string[][] playerOneEnts = new string[maxEnts][]; 
    string[][] playerTwoEnts = new string[maxEnts][]; 

    Array.Copy(allEnts[0], playerOneEnts, allEnts[0].Length); 
    Array.Copy(allEnts[1], playerTwoEnts, allEnts[1].Length); 

    for (int j = 0; j < playerOneEnts.Length; j++) 
    { 
     for (int i = 0; i < playerOneEnts[j].Length; i++) 
     { 
      Player += playerOneEnts[j][i] + ","; 
     } 

     Player = Player.TrimEnd(','); 
     Player += ";"; 
    } 

    Player = Player.TrimEnd(';'); 
    Player += "&"; 

    for (int j = 0; j < playerTwoEnts.Length; j++) 
    { 
     for (int i = 0; i < playerTwoEnts[j].Length; i++) 
     { 
      Player += playerTwoEnts[j][i] + ","; 
     } 

     Player = Player.TrimEnd(','); 
     Player += ";"; 
    } 

    Player = Player.TrimEnd(';'); 
    return Player; 
} 

public string[][][] convertToArray(string ents) 
{ 
    string[] p = new string[2]; 
    string[][] playerOneEnts = new string[maxEnts][]; 
    string[][] playerTwoEnts = new string[maxEnts][]; 
    string[][][] allEnts = new string[2][][]; 

    p = ents.Split('&'); 

    try 
    { 
     playerOneEnts = p[0].Split(new[] { ";" }, StringSplitOptions.RemoveEmptyEntries).Select(chunk => chunk.Split(',')).ToArray(); 
     playerTwoEnts = p[1].Split(new[] { ";" }, StringSplitOptions.RemoveEmptyEntries).Select(chunk => chunk.Split(',')).ToArray(); 

     MessageBox.Show(playerOneEnts.Length.ToString()); 

     Array.Copy(playerOneEnts, allEnts[0], playerOneEnts.Length); 
     Array.Copy(playerTwoEnts, allEnts[1], playerTwoEnts.Length); 
    } 
    catch 
    { 
     MessageBox.Show("unable to convert string", "Fatal Error"); 
    } 

    return allEnts; 
} 

код выглядит как бедствие для меня, если кто-нибудь знает более хороший способ превратить это в строку, я был бы счастлив для любых идей. Чтобы избавиться от моей ошибки, мне уже было бы достаточно.

Спасибо!

+1

Что такое 'maxEnts'? –

+0

int maxEnts = 750; –

ответ

5

Вот пример использования Linq (требуется .Net 4.0):

var source = "1,2,3;4,5,6&1,2,3;4,5,6"; 

string[][][] decoded = source.Split('&').Select(x => x.Split(';').Select(y => y.Split(',').ToArray()).ToArray()).ToArray(); 

string reencoded = String.Join("&", decoded.Select(x => String.Join(";", x.Select(y => String.Join(",", y))))); 

В качестве альтернативы IEnumarable дженерики могут быть использованы, чтобы избежать преобразования в массивах.

Предупреждение: Этот код не подтверждает ввод, например. длины массива.

Edit: Re-кодировщик для .NET 3.5:

var reencoded = String.Join("&", decoded.Select(x => String.Join(";", x.Select(y => String.Join(",", y)).ToArray())).ToArray()); 
1

Вы можете сделать это с помощью вложенной для-петли, как это:

string p = "1,2,3;4,5,6&1,5,3;4,5,9"; 
List<List<List<string>>> result = new List<List<List<string>>>(); 
foreach (var a in p.Split('&')) 
{ 
    List<List<string>> level2 = new List<List<string>>(); 
    foreach (var b in a.Split(';')) 
    { 
     level2.Add(new List<string>(b.Split(','))); 
    } 
    result.Add(level2); 
} 
var x = result[0][1][2]; // This will result in '6'. 

Кодирование аналогично:

string encoded; 
List<string> dec1 = new List<string>(); 
foreach (var a in result) 
{ 
    string e = ""; 
    List<string> z = new List<string>(); 
    foreach (var b in a) 
    { 
     z.Add(String.Join(",", b)); 
    } 
    e = String.Join(";", z); 
    dec1.Add(e); 
} 
encoded = String.Join("&", dec1);