1

いくつかの値を含むリストがあります。ID が配列内にあるすべてのデータを値とともに取得したいと考えています。現在の問題は、配列に 13 個の整数があるのに結果が 1 つしか得られないため、ループしないことです。

これは私のコードです: ここで、messages は整数の配列です。

 List<string> messageList = new List<string>();
 foreach (string i in messages)
 {  
     Recordset Persons = SDK.Create("R_PERSON", "", "PK_R_PERSON = "+i ,"" );
     if (Persons != null && Persons.RC > 0)
     {                   
         Persons.MoveFirst();

         do
         {
             string firstname = Persons.Fields["FIRSTNAME"].Value.ToString();
             string lastname = Persons.Fields["LASTNAME"].Value.ToString();

             personmessages.Add(firstname);
             personmessages.Add(lastname);

             PersoninboundSet.MoveNext();

         }
         while (!PersoninboundSet.EOF);
     }
     return personmessages;
 }


 messages.Add("Error, didn't work.");
 return messages;// null;

誰かが私が間違っていることを教えてもらえますか?

4

3 に答える 3

6

リターンをループの外に移動する必要があると思います。

List<string> personmessages = new List<string>();
 foreach (string i in messages)
 {  
    //// Do stuff.
 }
 return personmessages;
于 2013-06-26T14:26:00.560 に答える
1

ループとチェックの順序が混同されているようです。ループreturn personmessagesの外にしたい。foreach

each を見つけて、見つからない場合messagesはエラーを返すと仮定すると、エラー条件をループ内に移動する必要があります。 messageforeach

 List<string> personmessages = new List<string>();
 foreach (string i in messages)
 {  
     SDKRecordset PersoninboundSet = IQSDK.CreateRecordset("R_PERSON", "", "PK_R_PERSON = "+i ,"" );
     if (PersoninboundSet != null && PersoninboundSet.RecordCount > 0)
     {

         PersoninboundSet.MoveFirst();

         do
         {
             string firstname = PersoninboundSet.Fields["FIRSTNAME"].Value.ToString();
             string lastname = PersoninboundSet.Fields["LASTNAME"].Value.ToString();

             personmessages.Add(firstname);
             personmessages.Add(lastname);

             PersoninboundSet.MoveNext();

         }
         while (!PersoninboundSet.EOF);
     } 
     else 
     {
         // *this* i could not be found
         messages.Add("Error, didn't work.");
         return messages;// null;
     }
 }
 return personmessages; // after we've processed *all* messages

または、何も見つからなかっ た場合にエラーを返したいと思うかもしれません。messageその場合、ループの外でエラー チェックを行いますが、以下を確認してくださいCount

 List<string> personmessages = new List<string>();
 foreach (string i in messages)
 {  
     SDKRecordset PersoninboundSet = IQSDK.CreateRecordset("R_PERSON", "", "PK_R_PERSON = "+i ,"" );
     if (PersoninboundSet != null && PersoninboundSet.RecordCount > 0)
     {

         PersoninboundSet.MoveFirst();

         do
         {
             string firstname = PersoninboundSet.Fields["FIRSTNAME"].Value.ToString();
             string lastname = PersoninboundSet.Fields["LASTNAME"].Value.ToString();

             personmessages.Add(firstname);
             personmessages.Add(lastname);

             PersoninboundSet.MoveNext();

         }
         while (!PersoninboundSet.EOF);
     }
 }
 if (personmessages.Count == 0) 
 {
     // none found
     messages.Add("Error, didn't work.");
     return messages;// null;
 }      
 else
 {
     return personmessages; // after we've processed *all* messages
 }
于 2013-06-26T14:29:33.717 に答える
1

ダンが上で述べたようにreturn、関数を呼び出すと、ループが終了していなくても関数を離れます。ループの反復ごとに個別の戻り値が必要な場合は、各結果を配列に格納し、ループが終了したら単に配列を返すことをお勧めします。

List<string> personmessages = new List<string>();
List[] messageArray = new List[messages.length()];
foreach (string i in messages)
{  
    SDKRecordset PersoninboundSet = IQSDK.CreateRecordset("R_PERSON", "", "PK_R_PERSON = "+i ,"" );
 if (PersoninboundSet != null && PersoninboundSet.RecordCount > 0)
 {

     PersoninboundSet.MoveFirst();

     do
     {
         string firstname = PersoninboundSet.Fields["FIRSTNAME"].Value.ToString();
         string lastname = PersoninboundSet.Fields["LASTNAME"].Value.ToString();

         personmessages.Add(firstname);
         personmessages.Add(lastname);

         PersoninboundSet.MoveNext();

     }
     while (!PersoninboundSet.EOF);
 }
 messageArray[i] =  personmessages;
}
return messageArray;
于 2013-06-26T14:27:55.777 に答える