Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#foreach错误_C# - Fatal编程技术网

C#foreach错误

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

有一个叫做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);
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>
{
}