Подсчет элементов в списке не работает должным образом - PullRequest
1 голос
/ 08 октября 2019

У меня есть список, который содержит 91 пункт в нем. В настоящее время я зацикливаюсь и записываю каждую строку в текстовый файл, используя StreamWriter. Я хочу разделить список на 3, поэтому после 30 пунктов я хочу вставить пустую строку. Пока у меня есть

foreach (var item in textList)
{
   //write to file
   counter++;
   if (counter == totalItems / 3)
   {
      await sw.WriteLineAsync(Environment.NewLine);
   }
}

, но он работает только для первых 30 пунктов. Обратите внимание, что список может содержать любое количество элементов, но этот конкретный содержит 91. Однако мне всегда придется делить на 3.

Ответы [ 2 ]

3 голосов
/ 08 октября 2019

Вы хотите разделить список из 91 элемента на 3 или после 30 элементов. Вы не можете иметь оба. Если вы будете делать это после каждых 30 пунктов, у вас будет 91-ый элемент, отделенный от остальных, в отдельном «чанке», т.е. 1-30, 31-60, 61-90, 91. Если у вас есть 91 предмет и вы хотите разделить на 3, вы должны делать это каждые 31 предмет (следовательно, почему я использую Math.Ceiling). Таким образом, вы получите 1-31, 32-62 и 63-91.

Кроме того, не используйте foreach И счетчик;вместо этого используйте цикл for. И вы можете использовать оператор модуля. Как так:

int third = Convert.ToInt32(Math.Ceiling(textList.Count / 3.0));
int divider = third - 1;

for (int i = 0; i < textList.Count; i++)
{
    var itemToWrite = textList[i];
    //write to file

    if (i % third == divider) await sw.WriteLineAsync(Environment.NewLine);
}
0 голосов
/ 08 октября 2019

Используйте по модулю. Попробуйте как:

 if (counter % (totalItems / 3) == 0)
 {
   ...
...