我在foreach循环中遇到问题。
我有以下代码,它由一个基本对象组成:
public class DBFieldMap
{
public String fieldName { get; set; }
public String fieldValue { get; set; }
public DBFieldMap() { }
public DBFieldMap(String fname, String fvalue)
{
fieldName = fname;
fieldValue = fvalue;
}
}
使用上述对象的词典
public class MappedSQLFields : Dictionary<String, DBFieldMap>
{
public MappedSQLFields()
{
this.Add("firstname", new DBFieldMap());
this.Add("lastname", new DBFieldMap());
this.Add("email", new DBFieldMap());
etc...
}
}
具有基于上述对象的属性的另一个对象
public class Audience : IEnumerable
{
...
public MappedSQLFields audienceSQLMap
{
get;
set;
}
}
我希望能够循环遍历audienceSQLMap属性并提取DBFieldMap Dictionary对象的fieldName和fieldValue属性的值,但我收到了以下错误,尽管在&#34; foreach&#34 ;线。我尝试了各种明确的演员,但似乎仍然无法让CASTing发挥作用。
foreach (MappedSQLFields item in audience.audienceSQLMap)
{
//Do something with item.fieldName and item.fieldValue
}
错误49无法转换类型 &#39; System.Collections.Generic.KeyValuePair&#39;至 &#39; MappedSQLFields&#39;
非常感谢任何帮助。谢谢。
SAGA继续
好的,现在上面的工作得益于以下所有人的帮助,现在我在将对象的JSON等效项转换回原始对象时遇到了问题。我收到了我最初收到的同样的错误,但是我已经尝试了我能想到的各种CAST语句,它仍然让我感到悲伤。我显然对这个话题缺少了一些东西。
这很好用:
var json = new JavaScriptSerializer().Serialize(audienceSQLMap);
此行错误:
this.audienceSQLMap = (MappedSQLFields)new JavaScriptSerializer().Deserialize(json,typeof(KeyValuePair<String, DBFieldMap>));
答案 0 :(得分:3)
它希望你迭代一个键/值对。
修改代码以使用KeyValuePair<string, DBFieldMap>
:
foreach (KeyValuePair<string, DBFieldMap> item in audience.audienceSQLMap)
或者,更简洁,只需使用var
:
foreach (var item in audience.audienceSQLMap)
{
//Do something with item.fieldName and item.fieldValue
var name = item.Value.fieldName;
var value = item.Value.fieldValue;
...
}
如果你需要的只是Dictionary的值,你可以迭代那些:
foreach (DBFieldMap map in a.audienceSQLMap.Values)
{
var name = map.fieldName;
var value = map.fieldValue;
...
}
答案 1 :(得分:1)
您发布的代码的关键部分是:
public class DBFieldMap
{
public String fieldName { get; set; }
public String fieldValue { get; set; }
// elided
}
public class MappedSQLFields : Dictionary<String, DBFieldMap> { ... }
public class Audience
{
public MappedSQLFields audienceSQLMap { get; set; }
}
但希望迭代audience.audienceSQLMap
中的项目(我假设audience
是Audience
的实例)。
您可以利用audience.audienceSQLMap
为MappedSQLFields
Dictionary<String, DBFieldMap>
这一事实,而KeyValuePair<String, DBFieldMap>
又是{{3}}的集合。
这里要做的是:
foreach ( IEnumerable<KeyValuePair<<String, DBFieldMap>> kvp in audience.audienceSQLMap )
{
DBFieldMap map = kvp.Value;
//Do something with map.fieldName and map.fieldValue
}