Индексаторы

Последнее обновление: 11.08.2018
Упражнение 1

Определите класс футболиста, который содержит имя футболиста и его номер на поле. И определите класс футбольной команды, который хранит 11 футболистов в виде массива и обеспечивает доступ к этим футболистам через индексатор.

Возможно определение классов:

class Player
{
	public string Name { get; set; } // имя
	public int Number { get; set; } // номер
}
class Team
{
	Player[] players = new Player[11];

	public Player this[int index]
	{
		get { return players[index]; }
		set { players[index] = value; }
	}
}

Применение:

Team inter = new Team();
inter[0] = new Player { Name = "Ronaldo", Number = 9 };
inter[1] = new Player { Name = "R. Baggio", Number = 10 };
inter[2] = new Player { Name = "Simeone", Number = 8 };

Console.WriteLine(inter[1]?.Name);
Упражнение 2

В предыдущем упражнении в качестве предложенного решения использовался следующий код:

class Player
{
	public string Name { get; set; } // имя
	public int Number { get; set; } // номер
}
class Team
{
	Player[] players = new Player[11];

	public Player this[int index]
	{
		get { return players[index]; }
		set { players[index] = value; }
	}
}

При попытке доступа по индексу, который выходит за границы массива мы получим исключение:

Team inter = new Team();
inter[20] = new Player { Name = "Ronaldo", Number = 9 };

Исправьте код индексатора таким образом, чтобы он позволял избежать использования некорректных индексов.

Возможное решение заключается в проверке допустимости индекса:

class Player
{
	public string Name { get; set; } // имя
	public int Number { get; set; } // номер
}
class Team
{
	Player[] players = new Player[11];

	public Player this[int index]
	{
		get
		{
			if (index >= 0 && index < players.Length)
				return players[index];
			else
				return null;
		}
		set
		{
			if (index >= 0 && index < players.Length)
				players[index] = value;
		}
	}
}

Однако надо учитывать, что индексатор может вернуть вместо объекта Person значение null. Поэтому полученный в результате работы индексатора объект, если он представляет ссылочный тип, необходимо проверять на null.

Упражнение 3

Пусть даны следующие классы:

class Word
{
	public string Source { get; }
	public string Target { get; set; }
	public Word(string source, string target)
	{
		Source = source;
		Target = target;
	}
}
class Dictionary
{
	Word[] words;
	public Dictionary()
	{
		words = new Word[]
		{
			new Word("red", "красный"),
			new Word("blue", "синий"),
			new Word("green", "зеленый")
		};
	}
}

Класс Word представляет слово, где свойство Target хранит перевод слова. А класс Dictionary представляет словарь слов и хранит все слова в приватном массиве.

Добавьте в класс Dictionary индексатор таким образом, чтобы с помощью индексатора можно было по слову получить или изменить его перевод.

Возможное решение:

class Word
{
	public string Source { get; }
	public string Target { get; set; }
	public Word(string source, string target)
	{
		Source = source;
		Target = target;
	}
}
class Dictionary
{
	Word[] words;
	public Dictionary()
	{
		words = new Word[]
		{
			new Word("red", "красный"),
			new Word("blue", "синий"),
			new Word("green", "зеленый")
		};
	}
	public string this[string source]
	{
		get
		{
			Word word = null;
			foreach(Word w in words)
			{
				if(w.Source == source)
				{
					word = w;
                    break;
                }
			}
			return word?.Target;
		}
		set
		{
			foreach(Word w in words)
			{
				if(w.Source == source)
				{
					w.Target = value;
                    break;
                }
			}
		}
	}
}

Применение:

Dictionary dict = new Dictionary();
Console.WriteLine(dict["blue"]);
dict["blue"] = "голубой";
Console.WriteLine(dict["blue"]);
Дополнительные материалы
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850