У меня есть куча данных в формате с разделителями каналов, где нечетные записи - это индексы, и даже записи - это данные, например.
1|cat|2|dog|3|manatee|4||5|gerbil|6|etc
(обратите внимание на случайные отсутствующие значения)
и мне интересно, есть ли хороший способ .NET-типа превратить это в домашнее животное класса с параметрами id и name.
У меня есть код, который выполняет String.Split
и выполняет итерацию по массиву, соскабливая объекты, но это больше похоже на то, что я пишу PL/SQL, чем С#... Я уверен, что есть способ делать это в одной строке Linq или что-то еще - может ли кто-нибудь сказать мне "правильный" способ сделать это?
Спасибо
Вы можете использовать класс 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
}
}
}
Вот как я это сделал, который работает, но не кажется очень ".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;
}
i < PetArray.Count() - 1
если в конце есть сирота, иначе вы, скорее всего, получите исключения ArrayOutOfBounds. Кроме того, я бы протестировал PetArray[i]
перед вызовом Convert.ToInt32
(или вместо этого использовал Int32.TryParse()
), если элементы вышли из строя.
Вот мое решение для разделения строковых массивов с помощью "|". Он отлично работал с коллаборациями 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