【问题标题】:Counting of items in list not working as expected列表中的项目计数未按预期工作
【发布时间】:2019-10-08 23:21:48
【问题描述】:

我有一个包含 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 个。

【问题讨论】:

  • 你必须在写完空行后将你的counter重置为0
  • 您告诉它调用 WriteLineAsync() 一次:当计数器等于 30 时。如果您要关心最终结果,则需要 modulus operator计数,或者按照 pappenbence 的建议重置。
  • if (counter % 30 == 0) {...} 在每个30 项目之后做某事

标签: c# text-files


【解决方案1】:

您要么希望将 91 项的列表除以 3,要么将其划分为 30 项。你不能两者兼得。如果您在每 30 个项目之后执行此操作,那么您会将第 91 个项目与其他项目分开,在它自己的“块”上,即1-30, 31-60, 61-90, 91。如果你有 91 个项目,并且想除以 3,你应该每 31 个项目做一次(这就是我使用Math.Ceiling 的原因)。这样你就有 1-31、32-62 和 63-91。

另外,不要使用foreach AND 计数器;请改用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);
}

【讨论】:

    【解决方案2】:

    使用模数。试试看:

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

    【讨论】:

    • 如果我有一个只包含 20 个项目的列表,这将如何工作?我仍然希望它分成 3
    • 如果totalItems为20,则有3个分隔符;在 6 到 7 之间,在 12 到 13 之间以及 18 到 19 之间。我认为这不是 @Code 想要的,因为它将它分成 4 而不是 3。stackoverflow.com/a/58288918/9945524
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 2016-02-27
    • 1970-01-01
    • 2016-01-15
    • 2023-03-20
    相关资源
    最近更新 更多