Определите класс футболиста, который содержит имя футболиста и его номер на поле. И определите класс футбольной команды, который хранит 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);
В предыдущем упражнении в качестве предложенного решения использовался следующий код:
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.
Пусть даны следующие классы:
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"]);