C#foreach错误
有一个叫做parameters的类:C#foreach错误,c#,C#,有一个叫做parameters的类: 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); c
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));
}
类参数
{
字典参数;
公共字典addparam(int-sid,int-sbid)
{
if(paramids==null)
paramids=newdictionary();
paramids.Add(sid,sbid);
返回参数;
}
}
我不知道为什么会出现错误:“foreach语句无法对类型为“ConsoleApplication1.Parameters”的变量进行操作,因为“ConsoleApplication1.Parameter”不包含GetEnumerator的公共定义。您的
Parameters
类没有GetEnumerator
方法。就像错误所说的那样
您可以迭代paramids
字段,但为此您需要公开它,这在我看来是个坏主意
另一种方法是实现GetEnumerator
,将其转发到paramids。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;
}
}
foreach (var param in d.ParamIDs) {
....
}
您的
参数
类需要从字典
继承,或者通过foreach
公开其内部字典进行枚举:
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
没有GetEnumerator()?
方法,这是foreach
在集合上循环所依赖的方法。您应该重构Parameters
类(为该类创建一个单独的类看起来有点做工过度),并直接使用Dictionary
另一种方法是使用参数
实现GetEnumerator()
:
类参数
{
字典参数;
公共字典addparam(int-sid,int-sbid)
{
if(paramids==null)
paramids=newdictionary();
paramids.Add(sid,sbid);
返回参数;
}
公共IEnumerator GetEnumerator()
{
返回paramids.GetEnumerator();
}
}
如果要将参数
类用作字典,请从字典继承它:
类参数:字典
{
}
但是在这种情况下,最好只使用字典
错误消息的哪一部分是不可理解的?您知道为什么foreach
可以在数组上工作,但不能在日期时间
上工作吗?我不明白为什么您觉得需要定义该类。为什么不直接使用字典?或者更好的是,添加您的参数直接指向命令?我同意Jeff的观点。这个类很可能是不必要的。我们怎么做呢..实际上我对C#..不太了解。它不一定需要实现IEnumerable
接口,有一个可访问的GetEnumerator()
返回IEnumerator
的方法应该足够了。@Jeff Mercado:谢谢,我不知道。当然还有更多信息:实现IEnumerable
仍然是个好主意。例如,Linq只有在实现它时才起作用。一个具有GetEnumerator()的(非遗留)类
但没有实现IEnumerable
对我来说,这似乎是一个非常可疑的设计选择。
class Parameters {
Dictionary<int, int> paramids;
....
public Dictionary<int, int> ParamIDs {
get { return paramids; }
}
}
foreach (var param in d.ParamIDs) {
....
}
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();
}
}
class Parameters: Dictionary<int, int>
{
}