如何遍历类

时间:2017-04-14 06:34:37

标签: c# .net foreach iterable sortedlist

G'天,

在下面的简单代码示例中,我使用一个简单的List来在Employees对象中存储多个Employee对象。我想将List更改为SortedList,并将Employee.Number用作TKey,这样foreach循环将始终按递增的Employee.Number顺序打印员工,以便Employees类中的Item方法将检索Employee由Employee.Number而不是List中的索引位置。

我认为这是微不足道的,但我似乎无法通过语法使SortedList可以从Employees类外部进行迭代......?所以如果有人可以修改我的示例代码以向我展示方式,我将非常感激。

感谢您的帮助,

马丁。

using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
class Program
    {
    static void Main(string[] args)
    {
      clsEmployees Employees = new clsEmployees();

      Employees.Add(new clsEmployee(3, "Fred"));
      Employees.Add(new clsEmployee(5, "Jane"));
      Employees.Add(new clsEmployee(2, "Bob"));
      Employees.Add(new clsEmployee(1, "Sarah"));

      foreach (clsEmployee Employee in Employees)
      {
          Console.WriteLine("{0}  {1}", Employee.Number, Employee.Name);
      }

      Console.ReadLine();
    }
  }

public class clsEmployee
{
    public int Number;
    public string Name;

    public clsEmployee(int SetNumber, string SetName)
    {
        Number = SetNumber;
        Name = SetName;
    }
}

public class clsEmployees : IEnumerable<clsEmployee>
{
    private List<clsEmployee> EmployeeList;

    public clsEmployees()                             { EmployeeList = new List<clsEmployee>(); }

    IEnumerator IEnumerable.GetEnumerator()           { return GetEnumerator(); }
    public IEnumerator<clsEmployee> GetEnumerator()   { return EmployeeList.GetEnumerator(); }

    public void Add(clsEmployee NewEmployee)          { EmployeeList.Add(NewEmployee); }

    public clsEmployee Item(int Index)                { return EmployeeList[Index]; }
    }
}

2 个答案:

答案 0 :(得分:1)

不是尝试创建新类型,而是每次想要迭代时使用LINQ对列表进行排序

  clsEmployees Employees = new clsEmployees();
  Employees.Add(new clsEmployee(3, "Fred"));
  Employees.Add(new clsEmployee(5, "Jane"));
  Employees.Add(new clsEmployee(2, "Bob"));
  Employees.Add(new clsEmployee(1, "Sarah"));

  var sortedList = Employees.OrderBy(t => t.Number);
  foreach (var employee in sortedList)
  {
      Console.WriteLine("{0}  {1}", Employee.Number, Employee.Name);
  }

  Console.ReadLine();
PS:你似乎对C#的语法约定感到有些困惑。我建议你看一下MSDN的编码约定:https://msdn.microsoft.com/en-us/library/ff926074.aspx

答案 1 :(得分:1)

从您的问题中不清楚您有什么具体问题。您没有显示任何试图使用SortedList<TKey, TValue>的代码,因此无法确切知道您做错了什么。

以下是我如何处理它:

public class clsEmployees : IEnumerable<clsEmployee>
{
    private SortedList<int, clsEmployee> EmployeeList;

    public clsEmployees()
    {
        EmployeeList = new SortedList<int, clsEmployee>();
    }

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

    public IEnumerator<clsEmployee> GetEnumerator()
    {
        return EmployeeList.Values.GetEnumerator();
    }

    public void Add(clsEmployee NewEmployee)
    {
        EmployeeList.Add(NewEmployee.Number, NewEmployee);
    }

    public clsEmployee Item(int Index)
    {
        return EmployeeList[Index];
    }
}

注意:

  • SortedList<TKey, TValue>类型需要两个类型参数。第一个是键类型,第二个是值类型。您的密钥是Number属性,因此必须是int类型,而值是clsEmployee对象本身,因此必须是该类型。
  • 枚举时,您只需要集合中的值,而不是要使用整个集合枚举的键/值对。因此,您应该返回Values属性的GetEnumerator()结果。
  • 添加新对象时,需要指定键值。因此,NewEmployee.Number
  • SortedList<TKey, TValue>类型的索引器的工作方式与您想要的一样,因此无需更改任何内容。 :)
  • 我没有改变你的任何命名。但我确实同意您将从学习和遵循Microsoft的命名惯例中受益。

这看起来很像家庭作业。如果它是作业的一部分,你应该仍然可以与老师一起回顾你的不确定性和困难,这样他们就可以确保你已经学会了他们想要你学习的概念。