如何使用条件 C# 创建 for 循环
本文关键字:for 循环 创建 何使用 条件 | 更新日期: 2023-09-27 17:55:51
我创建循环来创建许多列。
我的公式:
[dt.Columns.Add("Name" + "{a, b, c}" + {1, 2, 3, 4})]
我有输入k = 3
是创建 3 列以 Name
、Class
、Score
开头。
这是我的第一个代码(它不起作用):
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");
根据您的要求,您的代码应如下所示:
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++;
}
您犯的错误:
- 您在不正确的位置递增了
charac
(应该在外循环的末尾,而不是在内循环的开头)。 - 循环应从 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++;
}
}