我正在使用字符串作为键,列表作为值。
以下列方式添加条目: -
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;
}
答案 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>
,那么肯定会有效。