我有如下代码:
sqlDataReader reader = getAddressQuery.sqlReader; while (reader.Read()) { foreach (Object ob in reader) { someText.InnerText = someText.InnerText + " " + ob.ToString(); } }
foreach循环中的代码不执行.但是,我可以这样做:
sqlDataReader reader = getAddressQuery.sqlReader; while (reader.Read()) { someText.InnerText = reader[0].ToString(); }
哪个工作.
显然,我可以使用常规的循环而不是foreach循环来实现相同的结果,但是我认为foreach语法更清晰,所以我可以使用它.
这里出了什么问题? c#中的foreach循环不像更高级语言那么灵活吗?
解决方法
像下面这样的东西请注意,IDataReader来自IDataRecord,它显示用于处理当前行的成员:
IEnumerable<IDataRecord> GetFromReader(IDataReader reader) { while(reader.Read()) yield return reader; } foreach(IDataRecord record in GetFromReader(reader)) { ... process it ... }
或者甚至类似于以下内容,从读者获取强类型实体对象的枚举或列表:
IEnumerable<T> GetFromReader<T>(IDataReader reader,Func<IDataRecord,T> processRecord) { while(reader.Read()) yield return processRecord(reader); } MyType GetMyTypeFromRecord(IDataRecord record) { MyType myType = new MyType(); myType.SomeProperty = record[0]; ... return myType; } IList<MyType> myResult = GetFromReader(reader,GetMyTypeFromRecord).ToList();
UPDATE响应Caleb Bell的评论.
我同意Enumerate是一个更好的名字.
事实上,在我的个人“常用”库中,我已经通过IDataReader上的扩展方法替换了上述内容:
public static IEnumerable<IDataRecord> Enumerate(this IDataReader reader) { while (reader.Read()) { yield return reader; } }
reader.Enumerate.Select(r => GetMyTypeFromRecord(r))