我需要FOREACH循环或四个变量循环的代码
本文关键字:循环 四个 变量 代码 FOREACH | 更新日期: 2023-09-27 18:28:26
我有四个相等长度的数组我在foreach循环中使用这些数组。我使用四个变量(I,j,k,l)来增加和进行
我在四个嵌套循环中编写代码,这些代码应该在I=0,j=0,k=,0,l=0时执行i=1,j=1,k=1,l=1i=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++;
}
}
我认为使用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;
我希望这就是你想要的,哈哈…
我认为在这种情况下,DataTable会比4个数组更好,对于这样的数据结构,您需要的算法将是微不足道的。
使用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
语句。)
好吧,这段代码真的很简单。。如果你只需要在i=j=k=l时显示数据,那么就不需要任何循环,甚至不需要i,j,k,l的存在。如果你能向我保证,无论什么东西(集合、数组、字典?)中的所有字符串都是有序的,那没关系。如果它们是有序的,那么丢弃所有的for each,只需按集合中具有最小值的所有控件的位置访问每个控件。如果没有对所有这些集合进行排序,那么这是完全无用的,因为每次运行都会产生不同的结果。一旦你能告诉我这是不是订购的,我会用一些代码编辑这个答案。
编辑:
首先,你需要检查哪个集合的项目最少(因为你不能超过这个)。。。我不知道这些东西的类型(你没有提供),所以我们假设它们有一个count属性。
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方法和一个计数属性
如果您试图在四个数组中处理相同的索引,只需使用一个循环并使用计数器访问该循环中每个数组中的值:
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)的结构,并具有该结构的一个数组