嵌套的 foreach 循环使用 C# 从嵌套列表中获取信息
Nested foreach loops to get info from nested lists using C#
EmployeeInfoDocument 对象包含组列表。每个组都有一个员工列表。我正在尝试使用嵌套的 foreach 循环将值写入 XML 文件。似乎我在内部 foreach 循环上的语法错误。 Visual Studio 给我以下错误:
foreach 语句不能对类型 'InfoObjects.Group' 的变量进行操作,因为 'InfoObjects.Group' 不包含 'GetEnumerator'
的 public 定义
如何从组内的每个员工那里提取信息?我是 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();
}
}
}
}
再次感谢。我已经坚持了几个小时了。
已编辑:缺少分号(非常抱歉!)
所以这是你的问题:
foreach (Group group in ...)
{
...
foreach (Employee employee in group)
{
}
}
编译器无法在 group
上使用 foreach
,因为它不知道您要迭代什么。您要么需要实施 IEnumerable<T>
(或至少提供适当的 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<T>
时,你还需要实现非泛型IEnumerable
,我已经用显式接口实现完成了,因为GetEnumerator
方法与IEnumerable<T>
.
- 目前这里几乎没有封装 - 例如,可以直接更改列表。您可以考虑隐藏列表,但为列表保留一个字段(自己初始化)并使用
Add(Employee)
方法或任何您需要的方法。
EmployeeInfoDocument 对象包含组列表。每个组都有一个员工列表。我正在尝试使用嵌套的 foreach 循环将值写入 XML 文件。似乎我在内部 foreach 循环上的语法错误。 Visual Studio 给我以下错误:
foreach 语句不能对类型 'InfoObjects.Group' 的变量进行操作,因为 'InfoObjects.Group' 不包含 'GetEnumerator'
的 public 定义如何从组内的每个员工那里提取信息?我是 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();
}
}
}
}
再次感谢。我已经坚持了几个小时了。
已编辑:缺少分号(非常抱歉!)
所以这是你的问题:
foreach (Group group in ...)
{
...
foreach (Employee employee in group)
{
}
}
编译器无法在 group
上使用 foreach
,因为它不知道您要迭代什么。您要么需要实施 IEnumerable<T>
(或至少提供适当的 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<T>
时,你还需要实现非泛型IEnumerable
,我已经用显式接口实现完成了,因为GetEnumerator
方法与IEnumerable<T>
. - 目前这里几乎没有封装 - 例如,可以直接更改列表。您可以考虑隐藏列表,但为列表保留一个字段(自己初始化)并使用
Add(Employee)
方法或任何您需要的方法。