[EDIT] Sau khi đọc lại OP đã chỉnh sửa, tôi nhận ra điều này không làm những gì được yêu cầu. Điều này sẽ chia cho mọi mục tiêu thứ n; OP muốn chia trên mọi mục tiêu SAU sau lần thứ n.
Dù sao tôi cũng sẽ để nguyên điều này ở đây.
Nếu bạn đang sử dụng MoreLinq extensions, bạn có thể tận dụng phương pháp Batch
của nó.
Mã của bạn sau đó sẽ trông như thế này:
string text = "1\t2\t3\t4\t5\t6\t7\t8\t9\t10\t11\t12\t13\t14\t15\t16\t17";
var splits = text.Split('\t').Batch(5);
foreach (var split in splits)
Console.WriteLine(string.Join("", split));
Tôi muốn có thể chỉ cần sử dụng thực hiện Oded, nhưng tôi nghĩ rằng tôi muốn đăng bài này cho một cách tiếp cận khác.
Việc thực hiện Batch()
trông như thế này:
public static class EnumerableExt
{
public static IEnumerable<IEnumerable<TSource>> Batch<TSource>(this IEnumerable<TSource> source, int size)
{
TSource[] bucket = null;
var count = 0;
foreach (var item in source)
{
if (bucket == null)
bucket = new TSource[size];
bucket[count++] = item;
if (count != size)
continue;
yield return bucket;
bucket = null;
count = 0;
}
if (bucket != null && count > 0)
yield return bucket.Take(count);
}
}
Nguồn
2013-04-16 10:44:58
'\ t' không phải là một dòng mới; đó là một tab. Ý bạn là nói 'newline'? –
câu hỏi của bạn không rõ ràng chỉnh sửa nó – gasroot
Ồ, phải. Tôi có nghĩa là tab sau đó. Nhưng điều đó không quan trọng. Nó nên là cùng một phương pháp để phân chia bất kỳ chuỗi trên sự xuất hiện thứ n và làm thế nào để tôi làm điều đó? –