1. Trang chủ
  2. » Công Nghệ Thông Tin

Tài liệu Mảng, Chỉ Mục, Tập Hợp phần 4 doc

12 324 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Bộ chỉ mục (Indexer) trong C#
Định dạng
Số trang 12
Dung lượng 187,07 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Ví dụ, ta có thể truy cập đối tượng ListBox được tạo ra như sau: string theFirstString = myListBox[0]; string theLastString = myListBox[myListBox.Length - 1]; Bộ chỉ mục là một cơ chế ch

Trang 1

Đôi khi chúng ta chúng ta mong muốn truy cập một tập hợp bên trong một lớp như thể bản thân lớp là một mảng Ví dụ, giả sử chúng ta tạo một điều khiển kiểu ListBox tên là myListBox chứa một danh sách các chuỗi lưu trữ trong một

mảng một chiều, một biến thành viên private myStrings Một List Box chứa các

thuộc tính thành viên và những phương thức và thêm vào đó mảng chứa các chuỗi của

nó Tuy nhiên, có thể thuận tiện hơn nếu có thể truy cập mảng ListBox với chỉ mục như thể ListBox là một mảng thật sự Ví dụ, ta có thể truy cập đối tượng ListBox được tạo ra như sau:

string theFirstString = myListBox[0];

string theLastString = myListBox[myListBox.Length - 1];

Bộ chỉ mục là một cơ chế cho phép các thành phần client truy cập một tập hợp chứa bên trong một lớp bằng cách sử dụng cú pháp giống như truy cập mảng ([]) Chỉ mục

là một loại thuộc tính đặc biệt và bao gồm các phương thức get() và set() để xác nhận những hành vi của chúng

Chúng ta có thể khai báo thuộc tính chỉ mục bên trong của lớp bằng cách sử dụng cú pháp như sau:

<kiểu dữ liệu> this [<kiểu dữ liệu> <đối mục>]

{ get; set; }

Kiểu trả về được quyết định bởi kiểu của đối tượng được trả về bởi bộ chỉ mục, trong khi đó kiểu của đối mục được xác định bởi kiểu của đối mục dùng để làm chỉ số vào trong tập hợp chứa đối tượng đích Mặc dù kiểu của chỉ mục thường dùng là các kiểu nguyên, chúng ta cũng có thể dùng chỉ mục cho tập hợp bằng các kiểu dữ liệu khác, như kiểu chuỗi Chúng ta cũng có thể cung cấp bộ chỉ mục với nhiều tham số để tạo ra mảng đa chiều

Từ khóa this tham chiếu đến đối tượng nơi mà chỉ mục xuất hiện Như một thuộc

tính bình thường, chúng ta cũng có thể định nghĩa phương thức get() và set() để xác định đối tượng nào trong mảng được yêu cầu truy cập hay thiết lập

Ví dụ 9.9 khai báo một điều khiển ListBox, tên là ListBoxTest, đối tượng này chứa một mảng đơn giản (myStrings) và một chỉ mục để truy cập nội dung của mảng

Ghi chú: Đối với lập trình C++, bộ chỉ mục đưa ra giống như việc nạp chồng toán tử

chỉ mục ([]) trong ngôn ngữ C++ Toán tử chỉ mục không được nạp chồng trong ngôn ngữ C#,

và được thay thế bởi bộ chỉ mục

Ví dụ 9.9: Sử dụng bộ chỉ mục

-

namespace Programming_CSharp

{

using System;

// tạo lớp ListBox

public class ListBoxTest

Trang 2

// khởi tạo ListBox với một chuỗi

public ListBoxTest( params string[] initialStrings)

{

// cấp phát không gian cho chuỗi

strings = new String[256];

// copy chuỗi truyền từ tham số

foreach ( string s in initialStrings)

{

strings[ctr++] = s;

}

}

// thêm một chuỗi

public void Add(string theString)

{

if (ctr >= strings.Length)

{

// xử lý khi chỉ mục sai

}

else

strings[ctr++] = theString;

Trang 3

}

// thực hiện bộ truy cập

public string this[int

index]

{

get

{

}

set

{

}

}

if ( index < 0 || index >= strings.Length)

{

// xử lý chỉ mục sai

}

return strings[index];

if ( index >= ctr)

{

// xử lý lỗi chỉ mục không tồn tại

}

else

strings[index] = value;

// lấy số lượng chuỗi được lưu

giữ public int GetNumEntries()

{

return ctr;

}

// các biến thành vịên lưu giữ mảng cho bộ chỉ mục private string[] strings;

private int ctr = 0;

}

// lớp thực thi

public class

Tester

{

Trang 4

static void Main()

{

// tạo một đối tượng ListBox mới và khởi tạo

ListBoxTest lbt = new ListBoxTest(“Hello”,”World”);

// thêm một số chuỗi vào lbt

lbt.Add(“Who”);

lbt.Add(“is”);

lbt.Add(“Ngoc”)

;

lbt.Add(“Mun”);

// dùng bộ chỉ mục

string strTest = “Universe”;

lbt[1] = strTest;

// truy cập và xuất tất cả các chuỗi

for(int i = 0; i < lbt.GetNumEntries(); i++)

{

Console.WriteLine(“lbt[{0}]: {1}”, i, lbt[i]);

}

}

}

}

-

Kết quả:

lbt[0]: Hello lbt[1]:

Universe lbt[2]:

Who lbt[3]: is

lbt[4]: Ngoc lbt[5]:

Mun

-Trong chương trình trên, đối tượng ListBox lưu giữ một mảng các chuỗi myStrings và một biến thành viên ctr đếm số chuỗi được chứa trong mảng myStrings

Chúng ta khởi tạo một mảng tối đa 256 chuỗi như sau:

myStrings = new String[256];

Phần còn lại của bộ khởi dựng là thêm các chuỗi được truyền vào tham số, và đơn giản

dùng lệnh lặp foreach để lấy từng thành phần trong mảng tham số đưa vào myStrings

Ghi chú: Nếu chúng ta không biết số lượng bao nhiêu tham số được truyền vào

Trang 5

phương thức, chúng ta sử dụng từ khóa params như đã mô tả trong phần trước của

chương

Phương thức Add() của ListBoxTest không làm gì khác hơn là thêm một chuỗi mới vào bên trong mảng myStrings

Tuy nhiên phương thức quan trọng của ListBoxTest là bộ chỉ mục Một bộ chỉ mục thì

không có tên nên ta dùng từ khóa this:

public string this [int index]

Cú pháp của bộ chỉ mục cũng tương tự như những thuộc tính Chúng có thể có phương thức get() hay set() hay cả hai phương thức Phương thức get() được thực thi đầu tiên bằng cách kiểm tra giá trị biên của chỉ mục và giả sử chỉ mục đòi hỏi hợp lệ, thì phương thức trả về giá trị đòi hỏi:

get

{

if (index < 0 || index >= myStrings.Length)

{

// xử lý chỉ mục sai

}

return myStrings[index];

}

Đối với phương thức set() thì đầu tiên nó sẽ kiểm trả xem chỉ mục của đối tượng cần lấy

có vượt quá số lượng của các đối tượng trong mảng hay không Nếu giá trị chỉ mục hợp

lệ tức là tồn tại một đối tượng có chỉ mục tương đương, phương thức sẽ bắt đầu thiết lập

lại giá trị của đối tượng này Từ khóa value được sử dụng để tham chiếu đến tham số

đưa vào trong phép gán của thuộc tính:

set

{

if ( index >= ctr)

{

// chỉ mục không tồn tại

}

}

Do vậy, nếu chúng ta viết:

myStrings[10] = “Hello C#”;

trình biên dịch sẽ gọi phương thức set() của bộ chỉ mục trên đối tượng và truyền vào

một chuỗi “Hello C#” như là một tham số ngầm định tên là value

Bộ chỉ mục và phép gán

Trong ví dụ 9.9, chúng ta không thể gán đến một chỉ mục nếu nó không có giá trị

Do đó, nếu chúng ta viết:

Trang 6

lbt[10] = “ah!”;

Chúng ta có thể viết điều kiện ràng buộc bên trong phương thức set(), lưu ý rằng chỉ mục

mà chúng ta truyền vào là 10 lớn hơn bộ đếm số đối tượng hiện thời là 6

Dĩ nhiên, chúng ta có thể sử dụng phương thức set() cho phép gán, đơn giản là phải xử

lý những chỉ mục mà ta nhận được Để làm được điều này, chúng ta phải thay đổi

phương thức set() để kiểm tra giá trị Length của bộ đệm hơn là giá trị hiện thời của bộ đếm số đối tượng

Nếu một giá trị được nhập vào cho chỉ mục chưa có giá trị, chúng ta có thể cập nhật bộ đếm như sau:

set

{

if ( index >= strings.Length)

{

// chỉ mục vượt quá số tối đa của mảng

}

else

{

strings[index] = value;

if ( ctr < index+1)

ctr = index+1;

}

}

Điều này có thể cho phép chúng ta tạo một mảng phân mảng các giá trị, khi đó ta có thể gán cho đối tượng có chỉ mục thứ 10 mà không cần phải có phép gán với đối tượng trước có chỉ mục là 9 Điều này hoàn toàn thực hiện tốt vì ban đầu chúng ta

đã cấp phát mảng 256 các phần tử Do đó chỉ cần truy cập đến đối tượng có chỉ mục

từ 0 đến 255 là hợp lệ Khi đó ta có thể viết:

lbt[10] = “ah!”;

Kết quả thực hiện tương tự như sau:

lbt[0]: Hello lbt[1]:

Universe lbt[2]:

Who lbt[3]: is

lbt[4]: Ngoc lbt[5]:

Mun lbt[6]:

lbt[7]:

lbt[8]:

lbt[9]:

Trang 7

lbt[10]: “ah!”

Sử dụng kiểu chỉ số khác

Ngôn ngữ C# không đòi hỏi chúng ta phải sử dụng giá trị nguyên làm chỉ mục trong một tập hợp Khi chúng ta tạo một lớp có chứa một tập hợp và tạo một bộ chỉ mục,

bộ chỉ mục này có thể sử dụng kiểu chuỗi làm chỉ mục hay những kiểu dữ liệu khác ngoài kiểu số nguyên thường dùng

Trong trường hợp lớp ListBox trên, chúng ta muốn dùng giá trị chuỗi làm chỉ mục cho mảng string Ví dụ 9.10 sau sử dụng chuỗi làm chỉ mục cho lớp ListBox Bộ chỉ mục gọi phương thức findString() để lấy một giá trị trả về là một số nguyên dựa trên chuỗi được cung cấp Lưu ý rằng ở đây bộ chỉ mục được nạp chồng và bộ chỉ mục từ ví dụ 9.9 trước vẫn còn tồn tại

Ví dụ 9.10: Nạp chồng chỉ mục

-

namespace Programming_CSharp

{

using System;

// tạo lớp List Box

public class ListBoxTest

{

// khởi tạo với những chuỗi

public ListBoxTest(params string[] initialStrings)

{

// cấp phát chuỗi

strings = new String[256];

// copy các chuỗi truyền vào

foreach( string s in

initialStrings)

{

strings[ctr++] = s;

}

}

// thêm một chuỗi vào cuối danh sách

public void Add( string theString)

{

strings[ctr] = theString;

ctr++;

}

// bộ chỉ mục

Trang 8

public string this [ int index ]

{

get

{

if (index < 0 || index >= strings.Length)

Trang 9

{ // chỉ mục không hợp lệ }

}

set

{

}

}

return strings[index];

strings[index] = value;

private int findString( string searchString)

{

for(int i = 0; i < strings.Length; i++)

{

if ( strings[i].StartsWith(searchString)) {

return i;

} }

return -1;

}

// bộ chỉ mục dùng chuỗi

public string this [string index]

{

get

{

if (index.Length == 0) {

// xử lý khi chuỗi rỗng }

}

set

{

}

}

return this[findString(index)];

strings[findString(index)] = value;

// lấy số chuỗi trong mảng

Trang 10

public int GetNumEntries()

{

return ctr;

}

// biến thành viên lưu giữ mảng các chuỗi

private string[] strings;

// biến thành viên lưu giữa số chuỗi trong mảng

private int ctr = 0;

}

public class Tester

{

static void Main()

{

// tạo đối tượng List Box và sau đó khởi tạo

ListBoxTest lbt = new ListBoxTest(“Hello”,”World”);

// thêm các chuỗi vào

lbt.Add(“Who”);

lbt.Add(“is”);

lbt.Add(“Ngoc”);

lbt.Add(“Mun”);

// truy cập bộ chỉ mục

string str =

“Universe”; lbt[1] =

str;

lbt[“Hell”] = “Hi”;

//lbt[“xyzt”] = “error!”;

// lấy tất cả các chuỗi ra

for(int i = 0; i < lbt.GetNumEntries();i++)

{

Console.WriteLine(“lbt[{0}] = {1}”, i, lbt[i]);

}

}

}

}

-

Kết quả:

l b t

Trang 11

[0]: Hi lbt[1]:

Universe lbt[2]:

Who

Trang 12

lbt[3]: is lbt[4]: Ngoc lbt[5]: Mun

Ngày đăng: 26/01/2014, 03:20

TỪ KHÓA LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm