簡體   English   中英

C#foreach錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM