2017-04-14 89 views
1

天儿真好内,如何通过排序列表遍历一个类

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

我认为这将是微不足道的,但我似乎没有能够从Employees类以外的SortedList迭代的语法正确......?所以,如果有人可以修改我的示例代码以向我展示方式,我将非常感激。

感谢你们的帮助,

马丁。

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

回答

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>类型的索引器就像你想要的那样工作,所以不需要改变任何东西。 :)
  • 我没有改变你的任何命名。但我确实同意你会从学习和遵循微软的命名惯例中受益。

这看起来很像家庭作业。如果这是作业的一部分,那么你或许应该回顾一下你对教师的不确定性和困难,以便他们确保你已经学会了他们希望你学习的概念。

+0

非常感谢,您的答案完全符合您的要求。这是你的第二点,我坚持 - 返回EmployeeList.VALUES.GetEnumerator(); - 我只是无法看到...。的 –

+0

非常感谢,您的答案完全符合要求。这是你的第二点,我坚持 - 返回EmployeeList.VALUES.GetEnumerator(); - 我无法看到。至于你,如果它的功课质疑,让我向你保证,这不是(当然,它的工作在家里,而不是作业的方式,你的意思是)其实我是一个电子硬件工程师在我50年代。我在一百万年前削减了Microsoft Level II Basic的编程牙齿。很久以后我做了很多VB 3,5和6,这些天,其主要是在嵌入式系统C和C++的,但偶尔我有点C#涉猎... –

+0

所以我的代码示例是故意非常简单的例子,只是足以说清楚我想做什么。我没有展示我的非工作简化示例,因为我太困惑了(或者太尴尬)了。无论如何,真正的类是“clsComponentRequestRecord”,大约有400行并且正在增长。是的,我的命名约定要求VB - 很难教老狗新的技巧......再次感谢Martin。 –

1

,而不是试图创建一个新的类型,你可以做的是那种你想在它遍历

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每次使用LINQ列表:你似乎是有点困惑关于C#的语法约定。我建议你看看MSDN的编码约定:https://msdn.microsoft.com/en-us/library/ff926074.aspx

+0

@Authur Attout非常感谢。我很清楚这种可能性,但我想用SortedList去感兴趣的话,看看我对Peter Duniho的解决方案的评论。再次感谢,马丁。 –