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