字典<string,list <string =“”>&gt;所有值都与上次输入的值相同</string,>

时间:2011-09-17 11:05:20

标签: c# list generics dictionary

我正在使用字符串作为键,列表作为值。

以下列方式添加条目: -

allDDLs = new Dictionary<string, List<string>>();
List<string> temp;
temp = ddlData.get("INV_DDL_Access_Mechanism", "Type");
allDDLs.Add("Access_Mechanism", temp);
temp = ddlData.get("INV_DDL_Application_Operating_System", "OS_Name");

像这样,有18个条目。但是当我调试代码时,我发现所有值都与上次输入的值相同。但钥匙很好。

例如,当我得到“INV_DDL_Access_Mechanism”的值时,我得到的值与“INV_DDL_Application_Operating_System”的值相同。

我不知道它有什么问题。任何帮助,将不胜感激。 : - )

提前致谢!

编辑1: 访问词典值的代码:

List<string> listOfColumns = allDDLs.Keys.ToList<string>();


for(int i = 0; i < listOfColumns.Count(); ++i) {
     string columnName = listOfColumns[i].ToString();
     List<string> tempDDL = new List<string>();
     tempDDL = allDDLs[columnName];
     List<string> columnValues = DataColumnToList(columnName, excelDataSet.Tables[0]);
     for (int j = 0; j < columnValues.Count(); ++j ) {
          if (!tempDDL.Contains(columnValues[j])) {
              errorReport.Rows[j][columnName.ToString()] = columnValues[j].ToString() + "LOLOLOL";
          }
     }        
}

编辑2: 代码“get”方法。

public List<string> get(string tableName, string parameter) {
        ds.Clear();
        valuesForDDL.Clear();
        ds = objDatabase.ByText("Select distinct " + parameter + " from " + tableName + " where Del_Status = 'Available'");
        foreach (DataRow row in ds.Tables[0].Rows) {
            valuesForDDL.Add(row.ItemArray[0].ToString());
        }
        return valuesForDDL;
}

3 个答案:

答案 0 :(得分:3)

你在评论中说:

  

我在添加新项目之前清除该代码中的列表。然后返回列表。

这可能是问题,...如果您在List<string>的每次调用中返回相同的 ddlData.get()(使用实例/静态字段或属性)并且您只需执行List<string>.Clear() 覆盖最后返回列表的内容。

ddlData.get() new List<string>()中,您应该Clear()而不是{{1}}现有列表。

如果这不是您的问题,请发布更多代码(尤其是ddlData.get()方法或整个类。)

答案 1 :(得分:2)

问题在于您的get方法。

每次拨打get时,您都会返回valuesForDDL,然后在下一个电话中清除它并重新填充它。看到这个bug了?

valuesForDDL不得为字段。这类似于拥有全球国家,全球国家杀死。将其设置为本地,您的代码将起作用。

public List<string> get(string tableName, string parameter) {
        var valuesForDDL = new List<Whatever>();
        var ds = objDatabase.ByText("Select distinct " + parameter + " from " + tableName + " where Del_Status = 'Available'");
        foreach (DataRow row in ds.Tables[0].Rows) {
            valuesForDDL.Add(row.ItemArray[0].ToString());
        }
        return valuesForDDL;
}

修改

正交注意:使用LINQ,您可以使此代码看起来更好。我将按如下方式重构您的代码:

public IEnumerable<string> Get(string tableName, string parameter) {
  var ds = objDatabase.ByText("Select distinct " + parameter + 
    " from " + tableName + " where Del_Status = 'Available'");
  return ds.Tables[0].Rows.Select(row => row.ItemArray[0].ToString());
}

答案 2 :(得分:-1)

您正在使用相同的List实例(代码中的“temp”)。

实例化新

List<string>

对于每个dllData.get("....,它会没问题。

List<string> temp1 = ddlData.get("INV_DDL_Access_Mechanism", "Type");    
List<string> temp2 = ddlData.get("INV_DDL_Application_Operating_System", "OS_Name");
....
allDDLs.Add("Access_Mechanism", temp1);
allDDLs.Add("Application_Operating_System", temp2);

修改

您不希望使用临时变量,因此请使用:

allDDLs.Add("Access_Mechanism", ddlData.get("INV_DDL_Access_Mechanism", "Type"));
allDDLs.Add("Application_Operating_System", ddlData.get("INV_DDL_Application_Operating_System", "OS_Name"));

如果ddlData.get(...)每次都创建一个新的List<string>,那么肯定会有效。