2016-03-21 1 views
0

Я хочу создать массив строк со значениями имен и некоторых чисел (которые являются строками) Я хочу передать их в функцию, которая примет массив, а затем разделит их на объект зазубренный массив (1 массив строк и 1 массив целых чисел)
массив:разделите массив строк на массив объектов с неровными объектами

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

и функция выглядит следующим образом:

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

} 

Что дальше?

+9

Следующий шаг: вы покажете нам, что вы пробовали. – Noctis

+0

http://pastebin.com/DHPRuDTu – N3wbie

ответ

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

Кажется, вы выделили * слишком много элементов * с помощью 'new object [bstr.Length] '; поэтому элементы хвоста 'bloop' будут' null' –

+0

Да, вы правы, мы не можем предсказать, сколько строк/целых чисел будет там, мы можем избежать этого, используя универсальные коллекции/списки и автоматически увеличивающиеся массивы , –

3

Ваш сценарий выглядит плохой дизайн, который может вызывать ошибки и проблемы с производительностью. Лучший способ - изменить код для использования общего List<> или что-то в этом роде. Но в вашей текущей проблеме вы можете использовать нижеприведенный код:

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

Я согласен с тем, что ваше требование звучит странно и должно решаться с помощью другого подхода. Тем не менее, это будет делать то, что вы хотите:

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

Ваш образец:

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

Если вам нужен второй массив в качестве int[] вы можете использовать следующие:

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

Это было мое решение: http://pastebin.com/DHPRuDTu, но did not work – N3wbie

0

Linq раствора ,

Вы две групп: первый из них имеют элементы, которые могут быть разобраны на int и вторая группа содержит все остальные, так GroupBy выглядит вполне естественно:

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

Тест:

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