Целочисленная индексация

В классе, имитирующем отдельную запись базы данных (совокупность пар «имя/значение»), индексатор может использоваться для обращения к полю записи по номеру:

using System;

using System.Collections;

class DataValue

{

public DataValue(string name, object data)

{

this.name = name;

this.data = data;

}

public string Name

{

get

{

return(name);

}

set

{

name = value;

}

}

public object Data

{

get

{

return(data);

}

set

{

data = value;

}

}

string name;

object data;

}

class DataRow

{

public DataRow()

{

row = new ArrayList();

}

public void Load()

{

/* Загрузка данных */

row.Add(new DataValue("Id", 5551212));

row.Add(new DataValue("Name", "Fred"));

row.Add(new DataValue("Salary", 2355.23m));

}

public object this[int column]

{

get

{

return(row[column - 1]);

}

set

{

row[column - 1] = value;

}

}

ArrayList row;

}

class Test

{

public static void Main()

{

DataRow row = new DataRow();

row.Load();

DataValue val = (DataValue) row[0];

Console.WriteLine("Column 0: {0}", val.Data);

val.Data = 12; // Присвоить значение полю ID

}

}

Класс DataRow содержит функции для загрузки записи, функции для сохранения данных и функцию-индексатор, обеспечивающую доступ к данным. В реальном классе функция Load() должна загружать данные из базы.

Функция-индексатор записывается так же, как свойство, за исключением того, что ей передается дополнительный параметр — индекс. Индексатор объявляется с именем this, поскольку он не имеет собственного имени.

Класс может иметь несколько индексаторов. Например, в классе DataRow было бы удобно выполнять индексацию не только по номеру, но и по имени поля:

using System;

using System.Collections;

class DataValue

{

public DataValue(string name, object data)

{

this.name = name;

this.data = data;

}

public string Name

{

get

{

return(name);

}

set

{

name = value;

}

}

public object Data

{

get

{

return(data);

}

set

{

data = value;

}

}

string name;

object data;

}

class DataRow

{

public DataRow()

{

row = new ArrayList();

}

public void Load()

{

/* Загрузка данных */

row.Add(new DataValue("Id", 5551212));

row.Add(new DataValue("Name", "Fred"));

row.Add(new DataValue("Salary", 2355.23m));

}

public object this[int column]

{

get

{

return(row[column - 1]);

}

set

{

row[column - 1] = value;

}

}

int FindColumn(string name)

{

for (int index = 0; index < row.Count; index++)

{

DataValue dataValue = (DataValue) row[index];

if (dataValue.Name == name)

return(index);

}

return(-1);

}

public object this[string name]

{

get

{

return this[FindColumn(name)];

}

set

{

this[FindColumn(name)] = value;

}

}

ArrayList row;

}

class Test

{

public static void Main()

{

DataRow row = new DataRow();

row.Load();

DataValue val = (DataValue) row["Id"];

Console.WriteLine("Id: {0}", val.Data);

Console.WriteLine("Salary: {0}",

((DataValue) row["Salary"]).Data);

((DataValue)row["Name"]).Data = "Barney"; // Присвоить значение

// полю name

Console.WriteLine("Name: {0}", ((DataValue) row["Name"]).Data);

}

}

Строковый индексатор при помощи функции FindColumn() находит индекс, соответствующий заданному имени, после чего поручает свою работу индексатору для типа int.

Индексаторы могут иметь несколько параметров, это позволяет имитировать многомерные виртуальные массивы.

Предлагаю ознакомиться с аналогичными статьями: