1

異なる情報を含む 3 つの配列があります。1 つの配列には多数の ID が含まれ、2 番目の配列には多数の日付が含まれ、3 番目の配列には多数の名前が含まれます。

これは簡単な質問であることはわかっていますが、その方法を思い出せないので、愚かなことをお詫びします。

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

これは、最初に配列全体を反復処理してから、2 番目のネストされた配列に戻ることを知っています。配列の最初の値を反復処理し、それらを変数に割り当ててから、2 番目の反復を実行しようとしています。

したがって、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

for3つの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は3つの配列すべての長さです(同じサイズである必要があります)。ループ変数を使用して、それらすべてにインデックスを付けます。

または、配列をZipすることもできますが、単純な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];
}

これは、3 つの配列がすべて同じ長さであることを前提としています。そうでない場合は、少し複雑になります。

于 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 に答える