0

さて、あなたはタイトルからアイデアを得たので、コードを投稿させてください。コメントで何が起こっているのか(そして何をすべきか!)を説明します。

// select distinct subject from database
cmd.CommandText = "SELECT DISTINCT SubjectId  FROM ClassSubject";
// a new command
OleDbCommand cmdTemp = new OleDbCommand();
// con id defined earlier
cmdTemp.Connection = con;
// Reader for outer loop
OleDbDataReader rdr;
// reader for inner loop
OleDbDataReader rdrTemp;
// reader for main command, that is for each subject
rdr = cmd.ExecuteReader();
// this will store subject id
int nTempID;
// this is the list that is supposed to contain all the classes (many to many relation btw class and subject)
// it does gets set fine, but later only 11 items show up
List<Int32> lstTempSub = new List<int>();
// a dictionary that will store all classes for this each particular subject
_clsSub = new Dictionary<int, List<int>>();
// read main, i.e. read subjects
while (rdr.Read())
{
    // set the id of subject
    nTempID = rdr.GetInt32(0);
    // clear previous items
    lstTempSub.Clear();
    // this selects all the classes for this particular subject
    cmdTemp.CommandText = "SELECT ClassId FROM ClassSubject WHERE SubjectID=" + nTempID + " ORDER BY ClassID";
    // Execute in the tempReader
    rdrTemp = cmdTemp.ExecuteReader();
    // read
    while (rdrTemp.Read())
    {
        // here, we add all the classes that are there for this particular subject to the list we createed
        lstTempSub.Add(rdrTemp.GetInt32(0));
    }
    // close inner one
    rdrTemp.Close();
    // every thing is fine till here,
    // i.e. nTempId is what is should be, the id of this particular subect
    // lstTempSub contains all class for this subject, may be 1 or may be 100
    _clsSub.Add(nTempID, lstTempSub);
}
// close outer one
rdr.Close();

// Here is where things get wrong
 foreach(KeyValuePair<Int32, List<Int32>> pair in _clsSub)
            {
                // when the debugger gets here, the key is fine for each subject
                // but pair.Value always have 11 values at most, if for a subject
                // there were less class, then it shows okay,
                // but in case there were more than 11, only 11 values are shown in pair.value
                SomeMethod(pair.Key, pair.Value);
            }

コードコメントですべてを説明したと思いますが、それでも何か説明が必要な場合は、お気軽にお問い合わせください。しかし、基本的に、私が言ったように、SomeMethodに到達したとき、リストはそのアイテムを維持していないようです(11以上の場合)(これは奇妙ですか?)それで、誰かがこれを手伝ってくれますか?どんな助けでもいただければ幸いです。

更新: 11個のアイテムが保存されているわけではなく、最後のサブジェクトのクラスの数が何であれ、その数のアイテムが保存されています。上のループで、サブジェクトの最後のIDが52で、そのIDに23のクラスがある場合、挿入されたすべてのレコードに対して、前であっても、_clsSub値のリストには最大23の項目が含まれます。

4

1 に答える 1

5

あなたはこれを一度宣言します:

List<Int32> lstTempSub = new List<int>();

これは参照型であるため、使用するときは常に、実際には参照型を使用しています。したがって、ループでこれを行うと、次のようになります。

_clsSub.Add(nTempID, lstTempSub);

辞書のすべてのスロットに同じリストを追加しています。そして、あなたがこれをするとき:

lstTempSub.Clear();

辞書のすべてのスロットで同じリストをクリアしています。そのため、ディクショナリ内のすべてのリストは同じリストであり、最後のループ(つまり、最後にクリアして追加したとき)にあったものが含まれることになります。

List<Int32> lstTempSub = new List<int>();行の代わりにwhileループに移動する必要がありlstTempSub.Clear();、すべてが機能します。

(タイトルの質問に答えると、わかりにくい場合に備えて、最後にループするのは11個のアイテムであるため、同じものを指しているため、すべてのアイテムに11個のアイテムがあるように見えます)

于 2012-05-13T22:44:51.677 に答える