【问题标题】:Problems casting in foreach loop在 foreach 循环中投射的问题
【发布时间】:2015-12-23 21:35:00
【问题描述】:

我在 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 属性的值,但我在“foreach”行收到以下错误。我尝试了各种显式转换,但似乎仍然无法让 CASTing 工作。

foreach (MappedSQLFields item in audience.audienceSQLMap)
{
    //Do something with item.fieldName and item.fieldValue
}

错误 49 无法转换类型 'System.Collections.Generic.KeyValuePair' 到 'MappedSQLFields'

任何帮助将不胜感激。谢谢。

传奇继续

好的,现在由于下面每个人的帮助,上述工作正常,现在我在将对象的 JSON 等价物转换回原始对象时遇到问题。我收到了与我最初收到的相同的错误,但尝试了我能想到的各种 CAST 语句,它仍然让我感到悲伤。我显然错过了关于整个主题的一些内容。

这很好用:

var json = new JavaScriptSerializer().Serialize(audienceSQLMap);

这一行出错:

this.audienceSQLMap = (MappedSQLFields)new JavaScriptSerializer().Deserialize(json,typeof(KeyValuePair<String, DBFieldMap>));

【问题讨论】:

  • 从您的代码看来,audience.audienceSQLMapMappedSQLFields 的单个实例,因此您无法对其进行迭代。你能更好地澄清Audience 类吗?

标签: c# asp.net


【解决方案1】:

它希望您迭代一个键/值对。

修改您的代码以使用KeyValuePair&lt;string, DBFieldMap&gt;

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;
    ...
}

【讨论】:

  • 非常感谢。这绝对解决了问题,我特别感谢您提出的仅遍历字典的建议——这是我的最终目标!但是,我很好奇,为什么我需要遍历 KeyValuePair 而不是 Dictionary 对象。他们不是一样的吗?谢谢。
  • 好的。现在我想我明白了。 没有多个 MappedSQLFields 可以迭代.. 有帮助。在它变得自然之前,我将不得不咀嚼几次。
  • @GranWinney - 谢谢。我刚才试过了。 Deserialize() 返回一个对象,但尝试您的建议的消息是它不包含方法 ToDictionary。我只是想反转 var json = new JavaScriptSerializer().Serialize(audienceSQLMap); 我认为这应该很简单。
  • 错误:MappedSQLFields 不包含一个参数的构造函数。
  • 做到了!再次感谢您的帮助!
【解决方案2】:

您发布的代码的关键部分是:

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 中的项目(我假设audienceAudience 的一个实例)。

您可以利用audience.audienceSQLMapMappedSQLFields,即Dictionary&lt;String, DBFieldMap&gt;,而KeyValuePair&lt;String, DBFieldMap&gt; 又是KeyValuePair&lt;String, DBFieldMap&gt; 的集合这一事实。

这里要做的是:

foreach ( IEnumerable<KeyValuePair<<String, DBFieldMap>> kvp in audience.audienceSQLMap )
{
    DBFieldMap map = kvp.Value;
    //Do something with map.fieldName and map.fieldValue
}

【讨论】:

  • 感谢您为帮助解决此问题所做的贡献。虽然我最终使用了格兰特的解决方案,但您的代码和解释非常有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-08
  • 2021-12-27
  • 1970-01-01
  • 1970-01-01
  • 2014-05-13
相关资源
最近更新 更多