Как поделить список на N-списков по длине строк - C#
Формулировка задачи:
Есть список в котором n-строк. Как поделить его на подсписки где суммарная длина символов <=40.
Допустим есть слова,
В итоге должно получиться следующее
Нашел в сети код, который делит строку на части, только не совсем понятно как его применить ко списку
абажур ткань потолок абажур ткань с абажур торшер вышивка абстрактные вышивка абстрактные вышивки
[абажур ткань потолок абажур ткань с] [абажур торшер вышивка] [абстрактные вышивка абстрактные вышивки]
public static IEnumerable<string> SplitByLength(this string str, int maxLength) {
for (int index = 0; index < str.Length; index += maxLength) {
yield return str.Substring(index, Math.Min(maxLength, str.Length - index));
}
}Решение задачи: «Как поделить список на N-списков по длине строк»
textual
Листинг программы
public class Program
{
public static IEnumerable<IEnumerable<string>> SplitByLength(IEnumerable<string> list, int maxLength)
{
var current = new List<string>();
int currentLength = 0;
foreach (var element in list)
{
if (element.Length > maxLength)
{
throw new InvalidOperationException("The element has too long length");
}
if (element.Length + currentLength > maxLength)
{
yield return current.ToArray();
current.Clear();
currentLength = 0;
}
currentLength += element.Length;
current.Add(element);
}
if (currentLength > 0)
{
yield return current;
}
}
public static void Main(string[] args)
{
var lstr = new List<string>();
lstr.Add("абажур ткань потолок");
lstr.Add("абажур ткань с");
lstr.Add("абажур торшер вышивка");
lstr.Add("абстрактные вышивка");
lstr.Add("абстрактные вышивки");
lstr.Add("абажур ткань потолок");
lstr.Add("абажур ткань с");
lstr.Add("абажур торшер вышивка");
lstr.Add("абстрактные вышивка");
lstr.Add("абстрактные вышивки");
foreach (var list in SplitByLength(lstr, 40))
{
Console.WriteLine(string.Join(Environment.NewLine, list));
Console.WriteLine();
}
}
}