Как я могу разбить строку на два отдельных массива с помощью .NET Framework? - PullRequest
0 голосов
/ 29 июля 2010

У меня есть строка, содержащая как целые числа, так и строку. Как мне разбить его на два массива, один для целых и один для строки? Мне также нужно поддерживать порядок, потому что я пишу систему парсинга файлов, которая зависит от чтения и правильного разбиения этих строк.

РЕДАКТИРОВАТЬ: Вот пример ввода, и что я хотел бы в качестве вывода:

~Wolf 100 45 4 5

Волк как строка в массиве и целые числа в их собственном отдельном массиве.

РЕДАКТИРОВАТЬ: немного больше информации:

Я получаю пять переменных от пользователя и записываю их в файл. Затем я читаю их снова. Мне нужно иметь возможность идентифицировать номера по имени. Теперь, когда я думаю об этом, на самом деле, я не уверен, что разделение строки - лучший путь. Есть ли способ поместить как целые, так и строки в один массив? Таким образом, я могу найти имя и узнать, что следующие четыре целых числа после него принадлежат ему.

Ответы [ 7 ]

3 голосов
/ 29 июля 2010

Используйте Dictionary(Of TKey, TValue) с String в качестве ключа и массив Integer() в качестве значения.Это даст вам функциональность поиска, которую вы ищете ...

Sub Main()
    Dim Input As String = "~Wolf 100 45 4 5" & Environment.NewLine & _
                          "~Racoon 500 41 9 7"

    Dim Dict As New Dictionary(Of String, Integer())

    For Each Line As String In Input.Split(Environment.NewLine)
        Dim Key As String
        Dim Values As Integer() = New Integer() {}

        For Each LineValue As String In Line.Split(" "c)
            Dim TryInt As Integer

            If Integer.TryParse(LineValue, TryInt) Then
                ReDim Preserve Values(Values.Length)
                Values(Values.Length - 1) = TryInt
            Else
                Key = LineValue.Trim("~")
            End If
        Next

        If Not String.IsNullOrEmpty(Key) Then
            Dict.Add(Key, Values)
        End If
    Next

    ' How to use                             \\'
    Dim WolfVals As Integer() = Dict.Item("Wolf")

    For Each Int as Integer in WolfVals
        Console.WriteLine(Int)
    Next

    Console.Read()
End Sub
2 голосов
/ 29 июля 2010

Мне нужно определить числа по имени.

Я не буду повторять ответы string.split, но, возможно, вам не следует использовать массивы в обоих случаях, но вы можете использовать объект для представления пользователя? например,

public class User
{
  public string UserName{get;set;}
  public List<int> Parameters= new List<int>();
}

Затем вы можете поместить пользователя в массив, список, словарь и т. Д., Чтобы найти пользователя, а затем получить параметры, введенные пользователем.

1 голос
/ 29 июля 2010

Как говорит @Fadrian:

List<int> integers = new List<int>();
List<string> strings= new List<string>();

foreach(var variable in originalstring.split(" ")){
 try{
  integers.Add(Convert.ToInt32(vaiable));
 }
 catch(){
  strings.Add(variable)
 }
}

Но из того, что я могу прочитать, я бы сделал что-то еще.Я хотел бы создать таблицу XML или базу данных или еще что-нибудь.

ЕСЛИ это действительно должен быть текстовый файл, использовать другой разделитель для вашего имени и чисел: например,

name |число1, число2, число ...

затем разделить один раз на "|"и первое имя, второе число.Затем разделите второй на ","

1 голос
/ 29 июля 2010

Pseudologic

  • Сначала разбейте строку на массив
  • Создать List<int> и List<string>
  • Выполните итерацию по массиву и используйте Int.TryParse, и если возвращаемое значение истинно, вставьте в List<int>, в противном случае List<string>

--- Отредактировано на примере -----

var list = line.Split(',', StringSplitOptions.RemoveEmptyEntries);
var intList = new List<int>();
var textList = new List<string>();
int val = 0;
foreach(var item in list)
{
   if(Int.TryParse(item, out val))
    intList.Add(val);
   else
    textList.Add(item);
}
0 голосов
/ 29 июля 2010
string input = "~Wolf 100 45 4 5";
IEnumerable<string> words = input.Split(' ')
                            .Where(a => a != null && a.Trim() != string.Empty);

List<int> numbers = new List<int>();
List<string> strings = new List<string>();
int value;

foreach (string word in words)
{
    if (int.TryParse(word, out value))
    {
        numbers.Add(value);
    }
    else
    {
        strings.Add(word);
    }
}
0 голосов
/ 29 июля 2010

У вас должно быть 2 разных разделителя, например:

Wolf # 100,45,4,5

Тогда вы можете выполнить:

string[] splitTheFirst = String.Split('#');
string[] splitTheSecond = splitTheFirst[0].Split(',');
int[] splitTheThird = splitTheFirst[1].Split(',');

Тогда у вас будет массив строк со строками из первого разбиения и массив целых чисел из второго массива из первого разбиения.

0 голосов
/ 29 июля 2010

Это зависит от того, как данные хранятся в этой строке.Если между числами есть разделитель, используйте String.Split()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...