如何在 class 中遍历 SortedList
How to iterate through a SortedList within a class
你好,
在下面的简单代码示例中,我使用一个简单的列表在一个 Employees 对象中存储多个 Employee 对象。我想将列表更改为使用 Employee.Number 作为 TKey 的 SortedList,以便 foreach 循环将始终按升序 Employee.Number 打印员工,以便员工中的 Item 方法class 将通过其 Employee.Number 而不是其在列表中的索引位置检索雇员。
我认为这很简单,但我似乎无法正确使用语法来使 SortedList 可从 Employees 外部迭代 class...?因此,如果有人可以修改我的示例代码来为我指路,我将不胜感激。
感谢您的协助,
马丁
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]; }
}
}
与其尝试创建新类型,不如每次迭代时使用 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
从你的问题中不清楚你具体遇到了什么问题。您没有显示任何尝试使用 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
对象本身,因此必须是该类型。
- 枚举时,您只需要集合中的值,而不是使用整个集合枚举的 key/value 对。所以你应该 return
Values
属性 的 GetEnumerator()
结果。
- 添加新对象时,需要指定键值。因此,
NewEmployee.Number
SortedList<TKey, TValue>
类型的索引器就像您想要的那样工作,因此无需在那里进行任何更改。 :)
- 我没有更改您的任何命名。但我同意您将从学习和遵循 Microsoft 的命名约定中受益。
这看起来很像家庭作业。如果它是作业的一部分,您可能仍然应该与老师一起检查您的不确定性和困难,以便他们可以确保您已经学习了他们希望您学习的概念。
你好,
在下面的简单代码示例中,我使用一个简单的列表在一个 Employees 对象中存储多个 Employee 对象。我想将列表更改为使用 Employee.Number 作为 TKey 的 SortedList,以便 foreach 循环将始终按升序 Employee.Number 打印员工,以便员工中的 Item 方法class 将通过其 Employee.Number 而不是其在列表中的索引位置检索雇员。
我认为这很简单,但我似乎无法正确使用语法来使 SortedList 可从 Employees 外部迭代 class...?因此,如果有人可以修改我的示例代码来为我指路,我将不胜感激。
感谢您的协助,
马丁
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]; }
}
}
与其尝试创建新类型,不如每次迭代时使用 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
从你的问题中不清楚你具体遇到了什么问题。您没有显示任何尝试使用 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
对象本身,因此必须是该类型。- 枚举时,您只需要集合中的值,而不是使用整个集合枚举的 key/value 对。所以你应该 return
Values
属性 的GetEnumerator()
结果。 - 添加新对象时,需要指定键值。因此,
NewEmployee.Number
SortedList<TKey, TValue>
类型的索引器就像您想要的那样工作,因此无需在那里进行任何更改。 :)- 我没有更改您的任何命名。但我同意您将从学习和遵循 Microsoft 的命名约定中受益。
这看起来很像家庭作业。如果它是作业的一部分,您可能仍然应该与老师一起检查您的不确定性和困难,以便他们可以确保您已经学习了他们希望您学习的概念。