Indexer trong C# - Kỹ Thuật Duyệt Qua Phần Tử Trong Một Đối Tượng (myClass[i])

Ở bài này tôi sẽ hướng dẫn các bạn một kỹ thuật để duyệt một Object theo kiểu duyệt Aray hay List. Chúng ta đã quá quen với việc duyệt một List theo kiểu thế này ' var result = myList[0].Value; ' vậy có bao giờ các bạn đặc vấn đề rằng sẽ duyệt các phần tử được chứa trong một đối tượng của mình theo kiểu trên, hôm nay chúng ta sẽ tìm hiểu.



Vấn đề tôi đặc ra là tôi có một Class mô tả một lớp học ClassXYZ, trong lớp học này tôi sẽ có một kiểu dữ liệu là List để giữ danh sách thông tin các học sinh (Students) trong lớp này. Vậy để lấy thông tin một học sinh nào đó trong lớp trên tôi sẽ phải thông qua một public propertyStudentlist của đối tượng ClassXYZ, tôi tự hỏi có cách nào tôi không cần thông qua property này không. Tôi sẽ mô tả điều này theo hai cách nghĩ là truyền thống và kỹ thuật indexer như sau.

Cách làm bình thường:



[code language="csharp"]
class Program
{
static void Main(string[] args)
{
var classXYZ = new ClassXYZ();

classXYZ.AddStudent(new Student(){Name = "Nguyen A",Stt = 0});
classXYZ.AddStudent(new Student() { Name = "Nguyen B",Stt = 1 });

Console.WriteLine("Student #{0} Name = {1}", 0, classXYZ.StudenList[0].Name);
Console.WriteLine("Student #{0} Name = {1}", 1, classXYZ.StudenList[1].Name);

Console.ReadKey();
}
}

//----------------------------
public class ClassXYZ
{
public List<Student> StudenList
{
private set;
get;
}

public ClassXYZ()
{
StudenList = new List<Student>();
}

public void AddStudent(Student student)
{
StudenList.Add(student);
}
}

//----------------------------
public class Student
{
public string Name { set; get; }
public int Index { set; get; }
}
[/code]

Kỹ thuật indexer


ở cách làm này tôi sẽ thêm vào ClassXYZ một property mà tên property này là từ khóa this, các bạn sẽ thấy sự thay đổi cách dùng ở hàm Main.

[code language="csharp"]
// Before
Console.WriteLine("Student #{0} Name = {1}", 0, classXYZ.StudenList[0].Name);
Console.WriteLine("Student #{0} Name = {1}", 1, classXYZ.StudenList[1].Name);

// After
Console.WriteLine("Student #{0} Name = {1}", 0, classXYZ[0].Name);
Console.WriteLine("Student #{0} Name = {1}", 1, classXYZ[1].Name);
[/code]


[code language="csharp"]
class Program
{
static void Main(string[] args)
{
var classXYZ = new ClassXYZ();

classXYZ.AddStudent(new Student(){Name = "Nguyen A",Stt = 0});
classXYZ.AddStudent(new Student() { Name = "Nguyen B",Stt = 1 });

Console.WriteLine("Student #{0} Name = {1}", 0, classXYZ[0].Name);
Console.WriteLine("Student #{0} Name = {1}", 1, classXYZ[1].Name);

Console.ReadKey();
}
}

//----------------------------
public class ClassXYZ
{
public List<Student> StudenList
{
private set;
get;
}

// Add it
public Student this[int index]
{
get
{
return StudenList[index];
}

set
{
StudenList[index] = value;
}
}

public ClassXYZ()
{
StudenList = new List<Student>();
}

public void AddStudent(Student student)
{
StudenList.Add(student);
}
}
[/code]

Hai cách trên đều cho cùng một kết quả:

[caption id="attachment_173" align="aligncenter" width="300"]Phạm Tuân Phạm Tuân[/caption]
Chúc các bạn thành công!
Phạm Tuân


Chúc các bạn thành công!
PHẠM TUÂN