附加C#时维护列表数据

时间:2013-03-26 22:49:45

标签: c# .net list generics

我只是注意到我写的一个函数存在问题,我意识到问题,但“修复”只会使情况恶化。

该函数连接到我的数据库并进行选择查询,然后它将所有行作为List<List<string>>返回,预期的行为为每一行返回1 List<string>,因为每行都有多列我可以使用列表索引访问它们。

                    try
                    {
                        ///Open connection before we can read
                        dataConnection.Open();

                        ///Prepare to read
                        reader = dataCommand.ExecuteReader();

                        // Call Read before accessing data.
                        while (reader.Read())
                        {
                            myTestData.Clear();
                            for (int i = 0; i < howManyColumns; i++)
                            {
                                ///Add columns to myTestData list
                                myTestData.Add(reader.GetValue(i).ToString());
                            }
                            ///Add myTestData list to dataRows
                            dataRows.Add(myTestData);
                        }
                    }
                    catch (SqlException exSql)
                    {
                        Program.displayExError(exSql, true);
                    }

问题在于:

myTestData.Clear();

我尝试清除列表,所以下次我将一个列表添加到列表列表中时,它将没有元素并避免将所有行附加到同一列表中,但是如果我执行myTestData.Clear();列表内容被删除,我的列表列表也丢失了所有内容,任何保留数据而不附加到第一个列表的想法?

PS:修复我做的是添加myTestData.Clear();这是导致问题的原因,但是如果我把它取下来,所有行都会附加到第一个List并且也没有用。如果问题不清楚请告诉我,试着澄清

Thx伙计们!

4 个答案:

答案 0 :(得分:1)

myData视为您要添加到dataRows的对象引用 - 当您清除myData时,dataRows保留的引用会反映出相同的更改。

因此,每次从datareader读取一行时,您只需创建一个新的List<string>

答案 1 :(得分:0)

您需要创建一个新列表,而不是Clear现有列表。将mydata.Clear()更改为myData = new List<string>()

答案 2 :(得分:0)

我会猜测并说你必须在for循环中重新初始化列表而不是

myTestData.Clear();

myTestData = new List<string>();

答案 3 :(得分:0)

我很开心你的List<List<string>>被称为dataRows。

您可以创建新的列表并存储它,而不是清除仍会添加对dataRows列表的引用的列表:

try
{
  ///Open connection before we can read
  dataConnection.Open();

  ///Prepare to read
  reader = dataCommand.ExecuteReader();

  // Call Read before accessing data.
  while (reader.Read())
  {
    List<string> myTestData = new List<string>();
    for (int i = 0; i < howManyColumns; i++)
    {
      ///Add columns to myTestData list
      myTestData.Add(reader.GetValue(i).ToString());
    }
    ///Add myTestData list to dataRows
    dataRows.Add(myTestData);
  }
}
catch (SqlException exSql)
{
  Program.displayExError(exSql, true);
}