我有四个长度相等的数组 我在foreach循环中使用这些数组。 我使用四个变量(i,j,k,l)来递增和继续
我在四个嵌套循环中编写代码,该代码应该在i = 0,j = 0,k =,0,l = 0时执行 I = 1,J = 1,K = 1,L = 1 I = 2,J = 2,K = 2,L = 2 .....(取决于数组长度)
请建议我这段所需的代码。
int i = 0, j = 0, k = 0, l = 0;
foreach (string fieldName in splitFieldnames)
{
i = 0;
foreach (string dataType in splitDatatypeNames)
{
j = 0;
foreach (string controlName in SplitControlNames)
{
k = 0;
foreach (string controlType in splitControlTypeNames)
{
if (i == j && j == k && k == l)
{
if (controlType == "textbox" && dataType == "string")
{
Response.Write("_Student." + fieldName + "= " + controlName + ".Text;");
l++;
break;
}
}
k++;
}
j++;
}
i++;
}
}
答案 0 :(得分:1)
我认为使用LINQ可以为您节省大量手动编码:
static void Main(string[] args)
{
var splitFieldnames = new string[] { "field1", "field2", "field3" };
var splitDatatypeNames = new string[] { "datatype1", "string", "string" };
var SplitControlNames = new string[] { "control1", "control2", "control3" };
var splitControlTypeNames = new string[] { "combobox", "textbox", "textbox"};
// this code can handle different sized arrays, but is based strictly
// on the size of the splitFieldnames array as the base.
var splitMerged = splitFieldnames.Select
((c, idx) =>
new
{
fieldName = c,
dataType = splitDatatypeNames.Length > idx ?
splitDatatypeNames[idx] : "",
controlName = SplitControlNames.Length > idx ?
SplitControlNames[idx] : "",
controlTypeName = splitControlTypeNames.Length > idx?
splitControlTypeNames[idx] : "",
});
foreach (var item in splitMerged
.Where(c => c.controlTypeName == "textbox" && c.dataType == "string"))
{
Response.Write("_Student." + item.fieldName + "= "
+ item.controlName + ".Text;");
}
结果输出如下:
_Student.field2= control2.Text;
_Student.field3= control3.Text;
我希望这就是你要找的东西,大声笑......
答案 1 :(得分:0)
我认为在这种情况下,DataTable会优于4个数组,并且您需要的算法对于这样的数据结构来说是微不足道的。
答案 2 :(得分:0)
如果您要完成的是处理四个数组中的相同索引,只需使用一个循环并使用计数器访问该循环中每个数组中的值:
foreach(string fieldName in SplitControlNames)
{
dataType = splitDatatypeNames[arrayPosition];
controlName = SplitControlNames[arrayPosition];
controlType = splitControlTypeNames[arrayPosition];
if (controlType == "textbox" && dataType == "string")
Response.Write("_Student." + fieldName + "= " + controlName + ".Text;");
arrayPosition++;
}
或者,创建并填充其中包含四个值的结构(fieldName,dataType,controlName,controlType)并具有该结构的一个数组
答案 3 :(得分:0)
好的,这段代码非常简单。如果你只需要在i = j = k = l时显示数据,那么就不需要任何循环,甚至不需要i,j,k,l的存在。 如果你可以向我保证所有这些字符串在任何东西(一个集合?一个数组?一个字典?)被订购,是可以的。 如果它们是有序的,那么扔掉所有的每个,并且只需按位置访问每个具有最小值的集合中的控件。 如果没有订购所有这些集合,那么这完全是用途,因为它会在每次运行时产生不同的结果。 我会用一些代码编辑这个答案,一旦你能告诉我这是否有序。
编辑:
首先,你需要检查哪个集合的项目最少(因为你不能超越它)......我不知道这些东西的类型(你没有提供它们),所以我们假设他们有一个计数属性。
int minimun = splitFieldnames.count;
if (splitDatatypeNames.count < minimun)
minimun = splitDatatypeNames.count;
if (SplitControlNames.count < minimun)
minimun = SplitControlNames.count
if (splitControlTypeNames.count < minimun)
minimun = splitControlTypeNames.count
一旦你有了最小值(因为你不能超越它),只需迭代它并打印你想要的任何东西
for (int i = 0; i < minimun;i++)
{
if (splitControlTypeNames[i].tostring() == "textbox" && splitDatatypeNames[i].tostring() == "string")
{
//Response.Write("_Student." + fieldName + "= " + controlName + ".Text;");
//Also, a parametric string would be better ;)
string result = string.format("_Student.{0}= {1}.Text;",splitFieldnames[0].tostring(),SplitControlNames[0].tostring());
Response.Write(result);
l++;
}
}
我不知道类型,所以我假设他们有一个tostring方法和一个count属性
答案 4 :(得分:0)
使用for
代替foreach
for (int i = 0; i < splitFieldnames.Length; i++)
{
string fieldName = splitFieldnames[i];
for (int j = 0; j < splitDatatypeNames.Length; j++)
{
string dataType = splitDatatypeNames[j];
for (int k = 0; k < SplitControlNames.Length; k++)
{
string controlName = SplitControlNames[k];
for (int l = 0; l < splitControlTypeNames.Length; l++)
{
string controlType = splitControlTypeNames[l];
if (i == j && j == k && k == l)
{
if (controlType == "textbox" && dataType == "string")
{
Response.Write("_Student." + fieldName + "= " + controlName + ".Text;");
break;
}
}
}
}
}
}
另请注意break
只会突破最内层的循环!请考虑使用return
语句。
更新(响应您的编辑):
解决方案很简单,只使用一个索引变量,只使用一个for
- 循环而不是大量foreach
- 循环
for (int i = 0; i < splitFieldnames.Length; i++)
{
if (splitControlTypeNames[i] == "textbox" && splitDatatypeNames[i] == "string")
{
Response.Write("_Student." + splitFieldnames[i] + "= " + SplitControlNames[i] + ".Text;");
break;
}
}
(假设您想在第一场比赛后停止。如果您想输出所有字符串文本框,请删除break
语句。)