W języku C# wywołanie metody .Split
spowoduje podzielenie łańcucha na tablicę łańcuchów na podstawie niektórych znaków lub ciągów znaków.Czy istnieje metoda "podzielonej listy" w języku C#?
Czy istnieje odpowiednia metoda dla list lub tablic?
Na przykład:
var foo = new List<int>() { 1, 2, 3, 0, 4, 5, 0, 6 };
var output = Split(foo, 0);
// produces { { 1, 2, 3 }, { 4, 5 }, { 6 } }
To, co mam tak daleko - jest tam czystsze lub bardziej wymowny sposób realizacji tego samego zadania?
IEnumerable<IEnumerable<T>> Split<T>(IEnumerable<T> list, T divider)
{
var output = new List<List<T>>();
var temp = new List<T>();
foreach (var item in list)
{
if (item.Equals(divider))
{
output.Add(temp);
temp = new List<T>();
}
else
{
temp.Add(item);
}
}
output.Add(temp);
return output;
}
Edit:
To właśnie przyszło mi do głowy, że moja wersja będzie podzielić listę tylko jednego elementu, natomiast string.Split
można podzielić przy użyciu pojedynczego znaku, lub dowolny ciąg znaków.
Tylko w celu zapewnienia kompletności, jaki byłby najlepszy sposób realizacji tego?
Możesz być w stanie coś zrobić z IndexOf, choć nie jestem pewien, jak to porównuje równości w ogóle ... – Jeff
Na Edycja - podczas gdy z pojedynczym separatorem jest całkiem prosto do przodu, co jest "dobrym/lepszym" kodem, nie jest tak w przypadku pasujących sekwencji: trzeba poprawnie radzić sobie z brakami podczas dopasowywania ("aabbaba" podzielone na 'bab' wymaga jakiejś formy ponownego przejrzenia pierwszego' b' do zwróć go) z różnymi kompromisami w wielu podejściach, aby to zrobić. Istnieje również wiele różnych algorytmów dopasowywania ciągów (dokładnie to, co chcesz w swojej edycji), które optymalizują dla różnych kryteriów. Więc edycja nie jest tak naprawdę odpowiedzialna (w sensie "najlepszego"). –
możliwy duplikat [Grupy po elemencie w Linq] (http://stackoverflow.com/questions/3759123/group-by-element-in-linq) – nawfal