저는이 유형의 처리를 매우 간단하게 만드는 몇 가지 확장 방법을 항상 가지고 있습니다. 솔루션 전체가 다른 것보다 길어질 것입니다. 그러나 이것들은 가지고 다니기에 유용한 방법이며 일단 확장 메소드를 사용하면 대답은 매우 짧고 읽기 쉽습니다.
public static IEnumerable<IEnumerable<T>> Split<T>(this IEnumerable<T> items,
Predicate<T> splitCondition)
{
using (IEnumerator<T> enumerator = items.GetEnumerator())
{
while (enumerator.MoveNext())
{
yield return GetNextItems(enumerator, splitCondition).ToArray();
}
}
}
private static IEnumerable<T> GetNextItems<T>(IEnumerator<T> enumerator,
Predicate<T> stopCondition)
{
do
{
T item = enumerator.Current;
if (stopCondition(item))
{
yield break;
}
yield return item;
} while (enumerator.MoveNext());
}
:
public static class EnumerableExtensions
{
public static IEnumerable<T> Zip<T>(
this IEnumerable<IEnumerable<T>> sequences,
Func<IEnumerable<T>, T> aggregate)
{
var enumerators = sequences.Select(s => s.GetEnumerator()).ToArray();
try
{
while (enumerators.All(e => e.MoveNext()))
{
var items = enumerators.Select(e => e.Current);
yield return aggregate(items);
}
}
finally
{
foreach (var enumerator in enumerators)
{
enumerator.Dispose();
}
}
}
}
다음 string.Split
문자열로 수행한다는 IEnumerable<T>
에 거의 같은 일을하는 분할 방법이있다 :
우선, 시퀀스의 임의의 수를 소요 우편 방법있다
이러한 확장자가 있으면 노래 가사 문제를 해결하면 케이크 한 조각이됩니다.
string lyrics = ...
var verseGroups = lyrics
.Split(new[] { Environment.NewLine }, StringSplitOptions.None)
.Select(s => s.Trim()) // Optional, if there might be whitespace
.Split(s => string.IsNullOrEmpty(s))
.Zip(seq => string.Join(Environment.NewLine, seq.ToArray()))
.Select(s => s + Environment.NewLine); // Optional, add space between groups
매우 편리한 ZIP 방식! – Larsenal