Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.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#_List_Foreach - Fatal编程技术网

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) {

我正在学习c#,我的代码有一些问题。我不知道为什么我不能在我的例子中使用foreach。我能做些什么来解决这个问题?有什么建议吗

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