c#如何修复foreach,当我尝试控制台时。在我的列表中写入元素<;字符串>;
我正在学习c#,我的代码有一些问题。我不知道为什么我不能在我的例子中使用foreach。我能做些什么来解决这个问题?有什么建议吗c#如何修复foreach,当我尝试控制台时。在我的列表中写入元素<;字符串>;,c#,list,foreach,C#,List,Foreach,我正在学习c#,我的代码有一些问题。我不知道为什么我不能在我的例子中使用foreach。我能做些什么来解决这个问题?有什么建议吗 public class Company { List<string> workers; public Company() { workers= new List<string>(); } public void AddWorker(string x) {
public class Company
{
List<string> workers;
public Company()
{
workers= new List<string>();
}
public void AddWorker(string x)
{
workers.Add(x);
}
}
static void Main(string[] args)
{
Company c1= new Company();
c1.AddWorker("Adam Snow");
c1.AddWorker("John Big");
c1.AddWorker("Chris Zen");
foreach (var x in c1)
{
Console.WriteLine(x);
}
}
上市公司
{
列出工人名单;
上市公司()
{
工人=新列表();
}
公共void AddWorker(字符串x)
{
增加(x);
}
}
静态void Main(字符串[]参数)
{
公司c1=新公司();
c1.AddWorker(“亚当·斯诺”);
c1.AddWorker(“约翰·比格”);
c1.AddWorker(“Chris Zen”);
foreach(c1中的变量x)
{
控制台写入线(x);
}
}
在行中
foreach (var x in c1)
您尝试迭代不可枚举的公司
实例。您希望迭代该实例的workers
列表
一种解决方案是将工人
变成公共财产:
public class Company
{
List<string> workers;
public IEnumerable<string> Workers { get { return workers; } }
// shortened for brevity
}
正如Dmitry所建议的,您可能希望仅将workers列表公开为只读,以便该类的用户无法从外部更改列表的内容:
public class Company
{
List<string> workers;
public IReadOnlyCollection<string> Workers
{
get { return workers.AsReadOnly(); }
}
// shortened for brevity
}
上市公司
{
列出工人名单;
公共IReadOnlyCollection工作人员
{
获取{return workers.AsReadOnly();}
}
//为简洁而缩短
}
如果要迭代公司
类实例,公司
必须实现IEnumerable
:
工作人员是否列出public并在c1中循环。工作人员则可以
public List<string> workers;
可能是因为您无法迭代
公司
?我想你想迭代该公司的工人
。foreach(c1.Workers中的var x)
但是你必须公开工人
。这是个好主意,但对于提出这种问题的人来说,可能有点太高级了。我认为当你向公司添加一名员工时,你不应该迭代公司。@ShadeToD它适用于这种特殊情况,但这是一个设计问题。如果在下一步中添加可能要迭代的部门、办公室或公司的任何其他属性,这对您没有帮助。尝试执行此操作时,我收到2个错误。第一个错误“company”未实现接口成员“IEnumerable.GetEnumerator()”Company.GetEnumerator()无法实现“IEnumerable.GetEnumerator()”,因为它没有匹配的返回类型“IEnumerator”。第二,使用泛型类型IEnumerator需要1个类型参数。@ShadeToD:实现取决于您使用导入的内容以及C#version等。System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator(){返回此.GetEnumerator();}
而不是回答中的IEnumerator IEnumerable.GetEnumerator()
,我更喜欢添加一个新属性public IEnumerable Workers=>Workers代码>而不是公开其他代码可以修改的列表。是的,定义属性看起来是更好的解决方案。谢谢,这是一个非常简单的答案。@ShadeToD请注意,如果您将其公开,其他代码可能会做一些讨厌的事情,如c1.workers=null
或c1.workers.Clear()
由于支持字段workers
属于List
类型,我建议至少返回IReadOnlyList
而不是IEnumerable
public class Company : IEnumerable<string>{
...
public IEnumerator<string> GetEnumerator() {
return workers.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator() {
return workers.GetEnumerator();
}
}
Company c1 = new Company();
foreach (var x in c1) {
Console.WriteLine(x);
}
public List<string> workers;
foreach (var x in c1.workers)
{
Console.WriteLine(x);
}