1

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

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

3 个数组如下所示:

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

这些值看起来像“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

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

这样 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"
4

5 回答 5

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);
}

如果你真的想要一个 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);

}

但我更喜欢第一个解决方案。

于 2012-10-10T13:16:09.457 回答
2

使用 for 循环迭代 N 次,其中 N 是所有三个数组的长度(它们必须是相同的大小)。使用循环变量来索引所有这些。

或者,您可以压缩数组,但与简单的 for 循环相比,这将非常复杂和尴尬。

于 2012-10-10T13:16:01.520 回答
2

不要使用foreach,只需使用普通for循环并使用您的索引来引用您的数组。

for (int i = 0; i < eventIDs.Length; i++)
{
    string eventID = eventIDs[i];
    string eventDate = eventDates[i];
    string invName = invNames[i];
}

这假设三个数组都是等长的。如果不是这种情况,那么它会稍微复杂一些。

于 2012-10-10T13:18:18.260 回答
2

你可以使用Enumerable.Zip

foreach(var data in eventIDs.Zip(eventDates,
                                 (x, y) => new { EventID = x, EventDate = y })
                            .Zip(invNames,
                                 (x, y) => new { EventID = x.EventID,
                                                 EventDate = x.EventDate,
                                                 InvName = y }))
{

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

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

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

}

这看起来有点复杂,但它的优点是即使数组的长度不同,它也可以毫无问题地工作。
老实说,我不认为我更喜欢这种方法而不是更简单的 for 循环。

于 2012-10-10T13:21:12.293 回答
1

您需要按索引进行迭代(如果您确定它们的大小相同):

for(int i = 0; i < eventIDs.Length; i++)
{
    var id = eventIDs[i];
    var date = eventDates[i];
    var name = invNames[i];
}
于 2012-10-10T13:18:07.070 回答