Разделить «первый, средний, средний, последний» на массив с 3 элементами (первый, средний, последний) - PullRequest
0 голосов
/ 14 декабря 2011

Я хотел бы разбить следующую строку на три элемента:

first, middle, middle, middle, middle, last

Таким образом, результат будет:

splits[0] = "first"
splits[1] = "middle, middle, middle, middle"
splits[2] = "last"

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

Ответы [ 4 ]

7 голосов
/ 14 декабря 2011
var s = "first, middle, middle, middle, middle, last";
var singleItems = s.Split(',').Select(x => x.Trim());
var splits = new []
             {
                 singleItems.Take(1).Single(),
                 singleItems.Skip(1).Take(singleItems.Count() - 2)
                                    .Aggregate("", (s1, s2) => s1 + s2 + ", ")
                                    .Trim(' ', ','),
                 singleItems.Skip(singleItems.Count() - 1).Single()
             };

Альтернативный способ сделать это будет следующим:

var firstIndex = s.IndexOf(',');
var lastIndex = s.LastIndexOf(',');
var splits = new []
             {
                 s.Substring(0, firstIndex),
                 s.Substring(firstIndex + 2, lastIndex - (firstIndex + 2)),
                 s.Substring(lastIndex + 2)
             };

Я думаю, что второе решение чище и проще для понимания.Но у него есть тот недостаток, что за первой и последней запятой должен следовать пробел.Это требование не существует для первой версии.

1 голос
/ 14 декабря 2011

Как насчет этого

var input = "first, middle, middle, middle, middle, last";


var outputs = input.Split(',').Select(wrd=>wrd.Trim())
                              .GroupBy(wrd=>wrd)
                              .Select(lst => string.Join(", ", lst)).ToArray();

output [0] = "first"
output [1] = "средний, средний, средний, средний"
output [2] = "last"

Select (... Trim ()) удаляет начальные пробелы после разделения.
GroupBy (...) дает три списка ({"first"}, {"middle", "middle", "middle", "middle"}, {"last"}
Select (... Join (...)) создает последние строки с правильными запятыми.

чч,
Алан.

0 голосов
/ 14 декабря 2011
string data = "first, middle, middle, middle, middle, last";

string[] splitData = data.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);

Dictionary<string, string> splits = new Dictionary<string, string>();

foreach (var s in splitData)
{
    var temp = s.Trim();
    if (splits.ContainsKey(temp))
    {
        splits[temp] += ", " + temp;
    }
    else
    {
        splits[temp] = temp;
    }
}

string[] result = splits.Select(y => y.Value).ToArray();
0 голосов
/ 14 декабря 2011
  string separator = ", ";
  string input = "first, middle, middle, middle, middle, last";
  int i1 = input.IndexOf(separator);
  int i2 = input.LastIndexOf(separator);
  string[] splits = new string[3];
  splits[0] = input.Substring(0, i1);
  splits[1] = input.Substring(i1 + separator.Length, i2 - i1 - separator.Length);
  splits[2] = input.Substring(i2 + separator.Length);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...