【问题标题】:Nested foreach loops to get info from nested lists using C#嵌套 foreach 循环使用 C# 从嵌套列表中获取信息
【发布时间】:2015-05-02 00:41:37
【问题描述】:

一个对象EmployeeInfoDocument 包含一个组列表。每个组都有一份员工名单。我正在尝试使用嵌套的 foreach 循环将值写入 XML 文件。似乎我在内部 foreach 循环中的语法错误。 Visual Studio 给我以下错误:

foreach 语句无法对“InfoObjects.Group”类型的变量进行操作,因为“InfoObjects.Group”不包含“GetEnumerator”的公共定义

如何从组内的每个员工那里提取信息?我对 C# 非常陌生。

任何见解将不胜感激。

namespace InfoObjects
{
    public class EmployeeInfoDocument
    {
        private List<Group> _groups = new List<Group>();
        public List<Group> Groups
        {
            get { return _groups; }
            set { _groups = value; }
        }
    }
    public class Group
    {
        private string _text = string.Empty;
        private List<Employee> _info = new List<Employee>
        public Group()
        {
        }
        public string Text
        {
            get {return _text; }
            set { _text = value; } 
        }
        public List<Employee> Employees
        {
            get { return _info }
            set { _info = value; }
        }
    }

    public class Employee
    {
         private string _name = string.Empty;
         private string _department = string.Empty;
         public Employee()
         {
         }
         public string Name
         {
         get { return _name;}
         set { _name = value;}
         }
         {
         public string Department
         {
         get { return _department};
         set { _department = value;}
         }
    }
}


namespace UI
{
    public partial class Mainform: Form
    {
        private void OnSave(object sender, EventArgs e)
        {
            SaveFileDialog saveFileDialog = new SaveFileDialog();
            saveFileDialog.RestoreDirectory = false;
            saveFileDialog.InitialDirectory = Assembly.GetExecutingAssembly().Location;
            saveFileDialog.Filter = "Employee Files|*.xml";
            saveFileDialog.DefaultExt = "xml";
            using (saveFileDialog)
            {
                if (saveFileDialog.ShowDialog(this) != DialogResult.OK)
                    return;
            }

            using (XmlWriter xmlw = XmlWriter.Create(saveFileDialog.FileName))
            {
                EmployeeInfoDocument k = new EmployeeInfoDocument();
                List<Group> myList = k.Groups;
                xmlw.WriteStartDocument();
                xmlw.WriteStartElement("EmployeeInfo");
                foreach (Group group in EmployeeInfoMgr.Document.Groups)
                {
                    xmlw.WriteStartElement("Group Name");
                    xmlw.WriteString(group.Text);
                    foreach (Employee employee in group)
                    {
                        xmlw.WriteStartElement("Employee Name");
                        xmlw.WriteString(employee.Name);
                        xmlw.WriteEndElement();
                        xmlw.WriteStartElement("Employee Department");
                        xmlw.WriteString(employee.Department);
                        xmlw.WriteEndElement();
                     }
                    xmlw.WriteEndElement();
                 }
                 xmlw.WriteEndElement();
                 xmlw.WriteEndDocument();
            }
        }
    }
}

再次感谢。我已经坚持了好几个小时了。

已编辑:缺少分号(非常抱歉!)

【问题讨论】:

  • 顺便说一句,您应该了解默认构造函数(可以删除不做任何事情的无参数构造函数而不影响代码)和自动实现的属性(您的所有属性都是微不足道的 - 您可以在一行代码中实现每一个)。
  • 另外,您的示例代码在 很多 处出现语法错误(主要是缺少分号)。请努力展示您感兴趣的问题的代码,而不是其他问题。
  • 您的代码仍然无法编译 - 您也错过了括号。理想情况下,您应该提供一个简短但完整的程序,该程序可以复制、粘贴、编译和运行(或查看相关的编译器错误,仅相关错误) .请阅读tinyurl.com/stack-hints

标签: c# xml foreach nested-loops nested-lists


【解决方案1】:

所以这是你的问题:

foreach (Group group in ...)
{
    ...
    foreach (Employee employee in group)
    {
    }
}

编译器不能使用foreach 而不是group,因为它不知道你要迭代什么。您要么需要实现IEnumerable&lt;T&gt;(或至少提供适当的GetEnumerator() 方法),要么指定您实际上想要迭代组中的员工:

foreach (Employee employee in group.Employees)

当然,后者变化不大,但是如果您希望能够只迭代一个组,则可以这样实现:

public class Group : IEnumerable<Employee>
{
    public string Text { get; set; }
    public List<Employee> Employees { get; set; }

    public IEnumerator<Employee> GetEnumerator()
    {
        return Employees.GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

注意事项:

  • 我已将属性替换为自动实现的属性,因为您只是在以一种微不足道的方式使用字段
  • 我已经删除了编译器默认提供的无参数构造函数
  • 在实现IEnumerable&lt;T&gt; 时,您还需要实现非泛型IEnumerable,因为GetEnumerator 方法与IEnumerable&lt;T&gt; 中的方法发生冲突,我已经通过显式接口实现完成了这一点。
  • 目前这里的封装很少 - 例如,可以直接更改列表。您可以考虑隐藏列表,但为列表保留一个字段(自己初始化)并使用 Add(Employee) 方法或任何您需要的方法。

【讨论】:

    猜你喜欢
    • 2018-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-24
    相关资源
    最近更新 更多