C#foreach错误

时间:2011-09-18 18:21:07

标签: 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));
} 

有一个叫做参数的类:

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的公共定义。

4 个答案:

答案 0 :(得分:3)

您的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();
    }
}

答案 1 :(得分:2)

您的Parameters类需要从Dictionary继承,或者通过foreach公开其内部词典进行枚举:

class Parameters {
    Dictionary<int, int> paramids;
    ....
    public Dictionary<int, int> ParamIDs {
        get { return paramids; }
    }
}

现在这样可行:

foreach (var param in d.ParamIDs) {
....
}

答案 2 :(得分:1)

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(); 
    }
}

答案 3 :(得分:1)

如果您想将Parameters类用作词典,请从Dictionary<int, int>继承:

class Parameters: Dictionary<int, int>
{
}

但在这种情况下,最好只使用Dictionary<int, int>