.net способ разделения нечетных и четных данных с разделителями

2

У меня есть куча данных в формате с разделителями каналов, где нечетные записи - это индексы, и даже записи - это данные, например.

1|cat|2|dog|3|manatee|4||5|gerbil|6|etc

(обратите внимание на случайные отсутствующие значения)

и мне интересно, есть ли хороший способ .NET-типа превратить это в домашнее животное класса с параметрами id и name.

У меня есть код, который выполняет String.Split и выполняет итерацию по массиву, соскабливая объекты, но это больше похоже на то, что я пишу PL/SQL, чем С#... Я уверен, что есть способ делать это в одной строке Linq или что-то еще - может ли кто-нибудь сказать мне "правильный" способ сделать это?

Спасибо

Теги:

3 ответа

3
Лучший ответ

Вы можете использовать класс TextFieldParser для обработки разбора строки в полях (я знаю это класс VB, но вы может получить к нему доступ с С#). Затем просто установите переменные поля для новых объектов.

Здесь пример из MSDN, измененный на С#:

using (Microsoft.VisualBasic.FileIO.TextFieldParser MyReader = 
       new Microsoft.VisualBasic.FileIO.TextFieldParser("C:\\testfile.txt")) 
   { 
        MyReader.TextFieldType = FileIO.FieldType.Delimited; 
        MyReader.SetDelimiters(","); 
        string[] currentRow = null; 
        while (!MyReader.EndOfData) 
        { 
            try 
            { 
                currentRow = MyReader.ReadFields(); 
                string currentField = null; 
                foreach (var currentField in currentRow) 
                { 
                    //set values for your object here
                } 
            } 
            catch (Microsoft.VisualBasic.FileIO.MalformedLineException ex) 
            { 
              //handle the exception
            } 
        } 
    } 
  • 0
    Спасибо за ваш ответ; TextFieldParser превосходит String.Split в этой ситуации? Что я действительно ищу, так это хороший .NET-способ установки значений на основе альтернативных элементов. Я разместил свое решение в другом ответе, но я не чувствую, что это очень «чистый» способ сделать это.
  • 1
    Я почти уверен, что, возможно, есть какой-то способ Linq, но я не знаю, насколько он знаком с Linq. Не знаю, будет ли он чище, чем у вас, или с использованием TextFieldParser. Преимущества TextFieldParser заключаются в том, что он надежно обрабатывает синтаксический анализ и все странные случаи (которых у вас, похоже, нет (много?) В вашем случае, но они могут возникнуть). Все, что вы катите самостоятельно, потребует много работы, прежде чем станет таким же надежным, как TextFieldParser.
1

Вот как я это сделал, который работает, но не кажется очень ".NET" способ сделать это...

public List<Pet> CreatePets(String PetData)
{
     List<Pet> PetList = new List<Pet>();
     string[] PetArray = PetData.Split(new char[]{'|'}, StringSplitOptions.None);
     for (int i = 0; i < PetArray.Count(); i += 2)
     {
         Pet NewPet= new Pet(Convert.ToInt32(PetArray[i]), PetArray[i+1]);
         PetList.Add(Field);
     }                
     return PetList;
}
  • 1
    Я думаю, что это, вероятно, во многих отношениях так же хорошо, как TextFieldParser. Несколько комментариев - ваше условие цикла должно быть i < PetArray.Count() - 1 если в конце есть сирота, иначе вы, скорее всего, получите исключения ArrayOutOfBounds. Кроме того, я бы протестировал PetArray[i] перед вызовом Convert.ToInt32 (или вместо этого использовал Int32.TryParse() ), если элементы вышли из строя.
0

Вот мое решение для разделения строковых массивов с помощью "|". Он отлично работал с коллаборациями GridView.

Public Function GridViewColumnsWidths(ByVal Gridview As GridView, ByVal ColumnNameCommaWidth As String) As Boolean
                Dim i As Boolean
                Dim ArrayOfItem As String() = Split(ColumnNameCommaWidth, "|",, CompareMethod.Text) 'eg: "ColA|200|ColB|100|ColC|300"
                For IndexOfItem As Integer = 0 To ArrayOfItem.Count - 1
                    Dim Column As String = ArrayOfItem(IndexOfItem)
                    Dim Width As Integer = Convert.ToInt16(ArrayOfItem(IndexOfItem + 1))
                    With Gridview.Columns
                        .Item(Column).Width = Width
                    End With
                    IndexOfItem += 1
                Next
                Return i
            End Function

Ещё вопросы

Сообщество Overcoder
Наверх
Меню