【问题标题】:Split list in foreach loop to add new line each iteration在 foreach 循环中拆分列表以在每次迭代中添加新行
【发布时间】:2025-12-31 13:20:08
【问题描述】:

我想逐行打印所有数据,其中每行包含“n”个数字,n 是用户定义的。 类似的东西:

void Print(List<int> list, int charactersPerLine)
{
  // TODO: magic here
}

用法

List<int> list = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8 }
Print(list, 4);

期望的输出:

1234
5678

到目前为止我尝试过:

List.AddRange(array);
List.Add(array2);
List.Add(array3);
foreach (int i in List)
{
     Console.Write("{0}", i);
}

当循环写入控制台时,List&lt;int&gt; 中的所有内容都写在一行中,输出如下:

12345678

这可能吗?

【问题讨论】:

  • 使用Console.WriteLine()
  • {0} 后面加一个回车。所以"{0}\n".
  • 你的名单是{1234, 5678} 还是{1, 2, 3, 4, 5, 6, 7, 8}?如果是后者,你如何定义“迭代”?
  • 我将其他数组添加到列表中以进行填充。所以说实话,我不确定。我将添加填充列表的额外代码。所有数组都由整数填充。
  • 我就把这个link留在这里...

标签: c# list foreach


【解决方案1】:

用途:

foreach (int i in List)
{
    Console.WriteLine("{0}", i);
}

如果您的输入是{1,2,3,4,5,6,7,8} 格式,您必须在使用Console.WriteLine()Console.Write() 时使用一些条件

const int LineCharacterLimit = 4;

int i = 0;    
foreach (int i in List)
{
   i++;
   if (i == LineCharacterLimit)
   {
      Console.WriteLine("{0}", i);
      i=0;
   }
   else 
   {
      Console.Write("{0}", i);
   } 
}

【讨论】:

  • 那么问题是我每行得到一个数字?
【解决方案2】:

您可以先使用字符串生成器。然后在每一行后面加上一个\n

StringBuilder str = new StringBuilder();
int count = 1;

foreach (int i in List)
{

     str.Append(i.ToString());

     if(count%4 ==0)
        str.Append("\n");
     count++;
} 

Console.Write(str.ToString());

【讨论】:

  • 你可以使用 str.AppendLine() 代替 Append("\n")
  • hmmm 尝试了这个没有乐趣 :( 这让我发疯了好几个小时,哈哈
  • 早些时候有人在学校对我说,如果我使用一个类,那么我可以将所有不同的数组视为唯一的,然后写入控制台将它们视为单独的。所以写行将是 Console.WriteLine("{0} {1} {2}", i.array, i.array2, i.array3);但我不知道该怎么做。我知道如何创建一个类,但不知道该怎么做。
【解决方案3】:

更通用的版本:

static class LinqExtensions
{
    public static IEnumerable<IEnumerable<T>> Batch<T>(this IEnumerable<T> source, int batchSize) 
    {
        int currentBatchSize = 0;
        List<T> batch = new List<T>();

        foreach (var e in source)
        {
            batch.Add(e);

            if (++currentBatchSize % batchSize == 0)
            {                
                yield return batch;
                batch.Clear();
            }            
        }
        yield return batch;
    }
}

我相信您可以在 morelinq 包中找到类似的内容。

用法:

static void Print(List<int> list, int charactersPerLine)
{
    foreach (var batch in list.Batch(charactersPerLine)) 
    {
        var strBatch = batch.Select(e => e.ToString()).ToArray();
        Console.WriteLine(string.Join(",", strBatch));
    }
}

【讨论】: