如何使用条件 C# 创建 for 循环

本文关键字:for 循环 创建 何使用 条件 | 更新日期: 2023-09-27 17:55:51

我创建循环来创建许多列。

我的公式:

[dt.Columns.Add("Name" + "{a, b, c}" + {1, 2, 3, 4})]

我有输入k = 3是创建 3 列以 NameClassScore 开头。

这是我的第一个代码(它不起作用):

char charac = 'A';
for (int k = 0; k < 3; k++)
{
    for (int m = 0; m < 4; m++)
    {
        charac++;
        dt.Columns.Add("Name" + charac + m);
        dt.Columns.Add("Class" + charac + m);
        dt.Columns.Add("Score" + charac + m);
    }
}

我想要这样的结果:

dt.Columns.Add("Name_a1");
dt.Columns.Add("Name_a2");
dt.Columns.Add("Name_a3");
dt.Columns.Add("Name_a4");
dt.Columns.Add("Name_b1");
dt.Columns.Add("Name_b2");
dt.Columns.Add("Name_b3");
dt.Columns.Add("Name_b4");
dt.Columns.Add("Name_c1");
dt.Columns.Add("Name_c2");
dt.Columns.Add("Name_c3");
dt.Columns.Add("Name_c4");

dt.Columns.Add("Class_a1");
dt.Columns.Add("Class_a2");
dt.Columns.Add("Class_a3");
dt.Columns.Add("Class_a4");
dt.Columns.Add("Class_b1");
dt.Columns.Add("Class_b2");
dt.Columns.Add("Class_b3");
dt.Columns.Add("Class_b4");
dt.Columns.Add("Class_c1");
dt.Columns.Add("Class_c2");
dt.Columns.Add("Class_c3");
dt.Columns.Add("Class_c4");

dt.Columns.Add("Score_a1");
dt.Columns.Add("Score_a2");
dt.Columns.Add("Score_a3");
dt.Columns.Add("Score_a4");
dt.Columns.Add("Score_b1");
dt.Columns.Add("Score_b2");
dt.Columns.Add("Score_b3");
dt.Columns.Add("Score_b4");
dt.Columns.Add("Score_c1");
dt.Columns.Add("Score_c2");
dt.Columns.Add("Score_c3");
dt.Columns.Add("Score_c4");

如何使用条件 C# 创建 for 循环

根据您的要求,您的代码应如下所示:

char charac = 'A';
for (int k = 1; k <= 3; k++)
{
    for (int m = 1; m <= 4; m++)
    {
        dt.Columns.Add("Name_" + charac + m);
        dt.Columns.Add("Class_" + charac + m);
        dt.Columns.Add("Score_" + charac + m);
    }
    charac++;
}

您犯的错误:

  1. 您在不正确的位置递增了charac(应该在外循环的末尾,而不是在内循环的开头)。
  2. 循环应从 1 开始,而不是从零开始。还应包括循环计数器的"上限"。

更新。在列顺序很重要的情况下 - 您需要为每个列前缀提供单独的循环。为了避免代码复制,可以将其重构为方法:

private void AddColumns(DataTable dt, string columnPrefix)
{
    char charac = 'A';
    for (int k = 1; k <= 3; k++)
    {
        for (int m = 1; m <= 4; m++)
        {
            dt.Columns.Add(columnPrefix + charac + m);
        }
        charac++;
    }
}

并将此方法用作

AddColumns(dt, "Name_");
AddColumns(dt, "Class_");
AddColumns(dt, "Score_");

我建议使用嵌套循环

string[] names = new string[] {
  "Name", "Class", "Score"};
foreach (string name in names)
  for (char charac = 'A'; charac <= 'C'; ++charac){
    for (int m = 1; m <= 4; ++m)
      dt.Columns.Add(String.Format("{0}_{1}{2}", name, charac, m));
将它们

存储在集合中并使用foreach循环:

List<string> letters = new List<string> { "a", "b", "c" };
List<string> types = new List<string> { "Name", "Class", "Score" };
List<int> ints = Enumerable.Range(1, 4).ToList();
foreach (string type in types)
{
    foreach (string letter in letters)
    {
        foreach (int i in ints)
        {
            dt.Columns.Add($"{type}_{letter}{i}");
        }
    }
}

定义集合中的字符。我还对其余代码进行了一些更改。

char[] chars = new char[3] { 'a', 'b', 'c'};
for (int k = 0; k < chars.Length; k++)
{
   var c = chars[k];
    for (int m = 1; m <= 4; m++)
    {
        dt.Columns.Add("Name" + "_" + c + m);
        dt.Columns.Add("Class" + "_" + c + m);
        dt.Columns.Add("Score" + "_" + c + m);
    }
}

试试这个,

        DataTable dt =new DataTable();
        char[] charac = {'A','B','C'};
        for (int k = 0; k < 3; k++)
        {
            for (int m = 0; m < 3; m++)
            {                    
                dt.Columns.Add("Name_" + charac[k]+(m+1));
                dt.Columns.Add("Class_" + charac[k]+(m+1));
                dt.Columns.Add("Score_" + charac[k]+(m+1));
            }
        }
这里有很多

显式循环的答案 - 这是一种使用 LINQ 方法链的方法:

var groups = new[] { "Name", "Class", "Score" };
var letters = new[] { "a", "b", "c" };
var range = Enumerable.Range(1, 4);
foreach(var column in groups
    .Join(letters, s => true, s => true, (prefix, letter) => $"{prefix}_{letter}")
    .Join(range, s => true,s => true,(prefix, i) => $"{prefix}{i}"))
{
    dt.Columns.Add(column);
}

很好,很简单。


当然,获得完整笛卡尔乘积.Join(..., s => true, s => true, ...)有点笨拙 - 但很容易将其隐藏在扩展方法中:

public static class EnumerableExtensions
{
    public static IEnumerable<T3> CrossJoin<T, T2, T3>(
        this IEnumerable<T> source,
        IEnumerable<T2> other,
        Func<T, T2, T3> resultSelector)
    {
        return source.Join(other, x => true, x => true, resultSelector);
    }
}

导致实际实施

var groups = new[] { "Name", "Class", "Score" };
var letters = new[] { "a", "b", "c" };
var range = Enumerable.Range(1, 4);
foreach(var column in groups
    .CrossJoin(letters, (prefix, letter) => $"{prefix}_{letter}")
    .CrossJoin(range, (str, i) => $"{str}{i}"))
{
    dt.Columns.Add(column);
}

这具有正确的元素顺序,并且具有额外的好处,即可以轻松地在管道末尾添加排序,转换,过滤等,因为它只是您循环的单个IEnumerable<string>

试试这段代码,它工作正常,而且很容易理解。实际上,它只是代码的修改版本。

需要创建一个方法以避免序列的额外循环。

    private void AddCols(DataTable dt, string Name)
{
    char charac = 'A';
    for (int k = 1; k <= 3; k++)
    {
        for (int m = 1; m <= 4; m++)
        {
            dt.Columns.Add(columnPrefix + charac + m);
        }
        charac++;
    }
}