如何一次迭代3个数组

use*_*319 1 c# asp.net foreach

我有3个包含不同信息的数组.1个数组包含一堆id,第二个数组包含一堆日期,第三个数组包含一堆名称.

我知道这是一个简单的问题,但我不记得怎么做,所以我为愚蠢而道歉.

3个数组看起来像这样:

string[] eventIDs = EventID.Split(',');
        string[] eventDates = eventCopyDate.Split(',');
        string[] invNames = investigatorNames.Split(',');
Run Code Online (Sandbox Code Playgroud)

这些值看起来像"john Doe,Mark Doe,Tim Doe",因此为什么.Split我在这里尝试了嵌套for循环,但没有成功.

foreach (var id in eventIDs)
        {
            foreach (var date in eventDates)
            {
                foreach (var name in invNames)
                {
                    cmd.Parameters.Add(new SqlParameter("@EventID", SqlDbType.Int));
                    cmd.Parameters["@EventID"].Value = int.Parse(id);

                    cmd.Parameters.Add(new SqlParameter("@InvestigatorName", SqlDbType.NVarChar));
                    cmd.Parameters["@InvestigatorName"].Value = name;

                    cmd.Parameters.Add(new SqlParameter("@CopyDate", SqlDbType.DateTime));
                    cmd.Parameters["@CopyDate"].Value = Convert.ToDateTime(date);

                }//end name foreach

            }//end date foreach
        }//end id foreach
Run Code Online (Sandbox Code Playgroud)

我知道在返回第二个嵌套数组之前,这将首先遍历整个数组.我试图迭代到数组中的第一个值,将它们分配给变量然后进行第二次迭代.

所以arrayNames:"john Doe,Mark Doe"arrayDates"12/12/12,10/12/12"和arrayID:"234,235,236"将被用作:

"john Doe" "12/12/12" "234"
"Mark Doe" "10/12/12" "235"
Run Code Online (Sandbox Code Playgroud)

Ste*_*e B 6

for假设3个三个数组具有相同的大小,请使用具有唯一索引的循环.

string[] eventIDs = EventID.Split(',');
string[] eventDates = eventCopyDate.Split(',');
string[] invNames = investigatorNames.Split(',');

for(int i=0; i<eventIDs.Length;i++) {
    var id = eventIDs[i];
    var date = eventDates[i];
    var name = invNames[i];
    cmd.Parameters.Add(new SqlParameter("@EventID", SqlDbType.Int));
    cmd.Parameters["@EventID"].Value = int.Parse(id);

    cmd.Parameters.Add(new SqlParameter("@InvestigatorName", SqlDbType.NVarChar));
    cmd.Parameters["@InvestigatorName"].Value = name;

    cmd.Parameters.Add(new SqlParameter("@CopyDate", SqlDbType.DateTime));
    cmd.Parameters["@CopyDate"].Value = Convert.ToDateTime(date);
}
Run Code Online (Sandbox Code Playgroud)

如果你真的想要一个foreach,你可以写这个,但它在我看来不太可读:

var assembled = Enumerable.Range(0, eventIDs.Length).Select(i=> new { id=eventIDs[i], name=invName[i], date=eventDates[i] } );

foreach(var value in assembled){

    cmd.Parameters.Add(new SqlParameter("@EventID", SqlDbType.Int));
    cmd.Parameters["@EventID"].Value = int.Parse(value.id);

    cmd.Parameters.Add(new SqlParameter("@InvestigatorName", SqlDbType.NVarChar));
    cmd.Parameters["@InvestigatorName"].Value = value.name;

    cmd.Parameters.Add(new SqlParameter("@CopyDate", SqlDbType.DateTime));
    cmd.Parameters["@CopyDate"].Value = Convert.ToDateTime(value.date);

}
Run Code Online (Sandbox Code Playgroud)

但我更喜欢第一种解决方案.

  • 你不应该使用语言结构,因为你觉得它,但因为它是正确的.Foreach就像你说的那样不起作用.要让它这样做的唯一方法是在foreach循环中增加一个计数器,然后用它来访问第二个和第三个数组,但这比循环标准更麻烦. (3认同)