2017-02-03 5 views
0

Я хочу вложенный список, как это:Как сделать вложенную форму списка список

{{"a","b","c","d"}, {"e","f"}, {"g"}} 

из этого списка:

{"a","b","c","d","*","e","f","*","g"} 

«*» является разделителем для разделения списка.

Я считаю, что есть элегантный способ LINQ для этого, но я не знаю, как это сделать.

ответ

2

Вот подход с классным Еогеасп петли

List<string> input = new List<string>(){"a","b","c","d","*","e","f","*","g"}; 
List<List<string>> result = new List<List<string>>(); 
List<string> temp = new List<string>(); 
foreach (string item in input) 
{ 
    if (item == "*") 
    { 
     result.Add(temp); 
     temp = new List<string>(); 
    } 
    else 
    { 
     temp.Add(item); 
    } 
} 
result.Add(temp); 
+2

читаемый, классный и простой; все одновременно. –

+0

Я думаю, что ваш путь является самым читаемым во всех ответах. Легко понять, нет расчета индекса. Благодаря! – lowcac

1

Хорошие новости. Вам даже не нужно LINQ:

var list = new List<string>() { "a", "b", "c", "d", "*", "e", "f", "*", "g" }; 
var newList = String.Concat(list).Split('*').ToList(); 

(Если не считать ToList, я полагаю.)

+0

Это дает один список туда, где '*' имеет были удалены. OP хочет список списков ... – user1429080

+0

@ user1429080 Попробуйте сами. – Abion47

+1

Решение правильное в том и только в том случае, если все элементы в 'list' являются * только символьными строками *. Возможный счетчик exanple: 'var input = new List () {" abc "," d "," * "," ef "," ghi "};' –

1

Если у вас Поиск Linq, вы можете попробовать GroupBy:

List<string> source = new List<string>() { 
    "a", "b", "c", "d", "*", "e", "f", "*", "g" }; 

    int index = 0; 

    List<List<string>> result = source 
    .Select(item => new { 
     item = item, 
     index = item == "*" ? ++index : index }) 
    .Where(chunk => chunk.item != "*") 
    .GroupBy(chunk => chunk.index, 
      chunk => chunk.item) 
    .Select(chunk => chunk.ToList()) 
    .ToList(); 

Тест:

string test = "{" + string.Join(", ", result 
    .Select(line => "{" + string.Join(", ", line) + "}")) + "}" ; 

    Console.Write(test); 

Результат:

{{a, b, c, d}, {e, f}, {g}} 

Альтернативным, не Linq но простой метод петли:

List<List<string>> result = new List<List<string>> { 
    new List<string>(), 
    }; 

    foreach (var item in source) 
    if (item == "*") 
     result.Add(new List<string>()); 
    else 
     result[result.Count - 1].Add(item); 
+2

Хорошая попытка выполнить запрос OP, но LINQ - это не всегда путь. Старомодный C# будет определенно более читабельным! – AFract

+0

Я считал, что LINQ был лучшим способом, но это была ошибка. Благодаря! – lowcac

Смежные вопросы