C#中为何无法对Models类实例用foreach?含Dictionary却报错
问题解答:foreach无法遍历Models类的原因及解决方法
代码与错误信息
定义的Models类
[Serializable] [DataContract] public class Models { [DataMember] public Dictionary<string, string> models { get; set; } public Models() { models = new Dictionary<string, string>(); } }
写入ini文件的方法
public bool write_all_model_names(Models models) { bool write_status = false; try { foreach (KeyValuePair<string, string> model in models) { Write(model.Key, model.Value); } write_status = true; } catch { } return write_status; }
编译错误
Error CS1579 foreach statement cannot operate on variables of type 'Models' because 'Models' does not contain a public instance or extension definition for 'GetEnumerator' CPTD_SJQ_UI
原因说明
Models类只是包含一个Dictionary类型的成员,但它本身并没有实现IEnumerable或IEnumerable<KeyValuePair<string,string>>接口,也没有提供对应的GetEnumerator扩展方法。foreach循环只能直接作用于实现了枚举器接口的对象,所以直接遍历Models实例会触发编译错误。
解决办法
方法一:直接遍历内部的Dictionary成员
修改foreach循环的遍历目标为Models实例中的models字典,而非Models本身:
public bool write_all_model_names(Models models) { bool write_status = false; try { foreach (KeyValuePair<string, string> model in models.models) { Write(model.Key, model.Value); } write_status = true; } catch { } return write_status; }
方法二:让Models类实现可枚举接口
如果希望直接用foreach (var item in models)的写法,可以让Models类实现IEnumerable<KeyValuePair<string, string>>接口,将枚举逻辑委托给内部的字典:
[Serializable] [DataContract] public class Models : IEnumerable<KeyValuePair<string, string>> { [DataMember] public Dictionary<string, string> models { get; set; } public Models() { models = new Dictionary<string, string>(); } public IEnumerator<KeyValuePair<string, string>> GetEnumerator() { return models.GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } }
修改完成后,原本的foreach代码即可正常编译运行。
内容的提问来源于stack exchange,提问作者PCG
相关产品推荐
相关产品推荐

