[英]C# foreach error
string connection = "Data Source=" + server + ";Initial Catalog=" + dbase +
";User ID=" + userid + ";Password=" + password;
conn = new SqlConnection(connection);
conn.Open();
SqlCommand cmd = new SqlCommand("SUBNETTEMP", conn);
cmd.CommandType = CommandType.StoredProcedure;
Parameters d = new Parameters();
d.addparam(15, 1);
d.addparam(15, 2);
foreach (var param in d)
{
cmd.Parameters.Add(new SqlParameter(param.Key, param.Value));
}
有一个称为参数的类:
class Parameters
{
Dictionary<int, int> paramids;
public Dictionary<int, int> addparam(int sid, int sbid)
{
if (paramids == null)
paramids = new Dictionary<int, int>();
paramids.Add(sid, sbid);
return paramids;
}
}
我不确定为什么会收到错误消息:“ foreach语句无法对'ConsoleApplication1.Parameters'类型的变量进行操作,因为'ConsoleApplication1.Parameter'不包含GetEnumerator的公共定义。
您的Parameters
类没有GetEnumerator
方法。 就像错误说的那样。
您可以遍历paramids
字段,但是为此,您需要公开公开它,这对IMO是个坏主意。
另一种方法是实现GetEnumerator
,将其转发到paramids.GetEnumerator
:
public IEnumerator<KeyValuePair<int,int>> GetEnumerator()
{
return paramids.GetEnumerator();
}
为了获得良好的效果,您还应该添加并实现IEnumerable<KeyValuePair<int,int>>
和IEnumerable
接口,即使它们对于简单的foreach
并不是必需的。
附带说明:我认为将内部字典公开为addparam
的返回值是一种可疑的设计选择。 如果您希望使用流畅的API,请返回您自己的Parameters
实例,而不是内部字典。 即使用return this
。
另外,我会使用.net命名约定,因此请调用方法AddParam
而不是addparam
。
因此,您的完整课程将是:
class Parameters:IEnumerable<KeyValuePair<int,int>>
{
Dictionary<int, int> paramids;
public Parameters AddParam(int sid, int sbid)
{
if (paramids == null)
paramids = new Dictionary<int, int>();
paramids.Add(sid, sbid);
return this;
}
public IEnumerator<KeyValuePair<int,int>> GetEnumerator()
{
return paramids.GetEnumerator();
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
您的Parameters
类将需要从Dictionary
继承,或公开其内部字典以通过foreach
进行枚举:
class Parameters {
Dictionary<int, int> paramids;
....
public Dictionary<int, int> ParamIDs {
get { return paramids; }
}
}
所以现在这可以工作:
foreach (var param in d.ParamIDs) {
....
}
Parameters
没有GetEnumerator()?
方法, foreach
在集合上循环所依赖。 您应该重构Parameters
类(为它提供了一个单独的类,看起来有些过高),并直接使用Dictionary<>
。
一种替代方法是让Parameters
实现GetEnumerator()
:
class Parameters
{
Dictionary<int, int> paramids;
public Dictionary<int, int> addparam(int sid, int sbid)
{
if (paramids == null)
paramids = new Dictionary<int, int>();
paramids.Add(sid, sbid);
return paramids;
}
public IEnumerator<KeyValuePair<int, int>> GetEnumerator()
{
return paramids.GetEnumerator();
}
}
如果要将Parameters
类用作字典,请从Dictionary<int, int>
继承它:
class Parameters: Dictionary<int, int>
{
}
但是在这种情况下,最好只使用Dictionary<int, int>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.