У меня есть строка как так:
mystring = "test1, 1, anotherstring, 5, yetanother, 400";
myarray может иметь переменную длину. То, что я хотел бы сделать, разделено строка как так:
{"test1, 1"}
{"anotherstring, 5}
{"yetanother, 400"}
Действительно ли это возможно? Я попробовал string[] newArray = mystring.Split(',')
но это разделяет его в каждой запятой а не второй запятой, которая является тем, что я хотел бы сделать.
Спасибо за помощь
Столкновения
Вы можете использовать регулярное выражение для сопоставления двух элементов в строке:
string[] parts =
Regex.Matches(myarray[0], "([^,]*,[^,]*)(?:, |$)")
.Cast<Match>()
.Select(m => m.Groups[1].Value)
.ToArray();
Это получает элементы из первой строки в массиве. Я не знаю, почему у вас есть строка в массиве, и если у вас более одной строки, в этом случае вам нужно пройти через них и получить элементы из каждой строки.
Нет прямого способа заставить String.Split делать это.
Если производительность не является проблемой, вы можете использовать LINQ:
var input = "test1, 1, anotherstring, 5, yetanother, 400";
string[] result = input.Split(',');
result = result.Where((s, i) => i % 2 == 0)
.Zip(result.Where((s, i) => i % 2 == 1), (a, b) => a + ", " + b)
.ToArray();
В противном случае вам, вероятно, придется вручную разделить строку с помощью String.IndexOf или с помощью регулярного выражения.
Интересный вопрос... Я бы сделал так:
string input = "test1, 1, anotherstring, 5, yetanother, 400";
string pattern = @"([^,]*,[^,]*),";
string[] substrings = Regex.Split(input, pattern).Where(s => s!="").Select(s => s.Trim()).ToArray();
Вы получите именно то, что хотите. Только он грязный... =P =)
с использованием IEnumerator ..
var myarray = "test1, 1, anotherstring, 5, yetanother, 400";
System.Collections.IEnumerator iEN = myarray.Split(',').GetEnumerator();
var strList = new List<string>();
while (iEN.MoveNext())
{
var first = iEN.Current;
iEN.MoveNext();
strList.Add((string)first + "," + (string)iEN.Current);
}
:)
Не только с Split
, но этого, конечно, можно добиться.
Я так понимаю, что myarray
на самом деле строка, а не массив...?
В таком случае, вы могли бы сделать что-то вроде этого:
string myarray = "test1, 1, anotherstring, 5, yetanother, 400";
string[] sourceArray = myarray.Split(',');
string[] newArray = sourceArray.Select((s,i) =>
(i % 2 == 0) ? "" : string.Concat(sourceArray[i-1], ",", s).Trim()
).Where(s => !String.IsNullOrEmpty(s)).ToArray();
Вы, вероятно, могли бы использовать регулярное выражение в исходной строке, чтобы заменить каждую другую запятую другим «токеном», например ';' Затем просто вызовите string.split для нового токена.
Здесь еще одно решение на основе LINQ. (Возможно, не самый эффективный, но он позволяет использовать сжатый код и работает для группировки в группы произвольного размера).
1) Определите новый оператор запроса, InGroupsOf
:
public static IEnumerable<T[]> InGroupsOf<T>(this IEnumerable<T> parts,
int groupSize)
{
IEnumerable<T> partsLeft = parts;
while (partsLeft.Count() >= groupSize)
{
yield return partsLeft.Take(groupSize).ToArray<T>();
partsLeft = partsLeft.Skip(groupSize);
}
}
2) Во-вторых, примените его к вашему вводу:
// define your input string:
string input = "test1, 1, anotherstring, 5, yetanother, 400";
// split it, remove excessive whitespace from all parts, and group them together:
IEnumerable<string[]> pairedInput = input
.Split(',')
.Select(part => part.Trim())
.InGroupsOf(2); // <-- used here!
// see if it worked:
foreach (string[] pair in pairedInput)
{
Console.WriteLine(string.Join(", ", pair));
}