Jedi Code Library предоставляет расширенный StringList со встроенной функцией Split, которая способна как добавлять, так и заменять существующий текст. Он также обеспечивает интерфейс с подсчетом ссылок. Таким образом, это можно использовать даже со старыми версиями Delphi, у которых нет SplitStrings и без осторожных и немного утомительных настроек запаса TStringList, чтобы использовать только указанные разделители.
Например, данный текстовый файл таких строк, как Dog 5 4 7
one могут анализировать их, используя:
var slF, slR: IJclStringList; ai: TList; s: string; i: integer;
action: procedure(const Name: string; Const Data: array of integer);
slF := TJclStringList.Create; slF.LoadFromFile('some.txt');
slR := TJclStringList.Create;
for s in slF do begin
slR.Split(s, ' ', true);
ai := TList.Create;
try
for i := 1 to slR.Count - 1 do
ai.Add(StrToInt(slR[i]));
action(slR[0], ai.ToArray);
finally ai.Free; end;
end;
http://wiki.delphi-jedi.org/wiki/JCL_Help:IJclStringList.Split@string@string@Boolean
См. Спецификацию языка, раздел 10.9, в которой говорится:
Индексатор - это член, который позволяет индексировать объект так же, как массив.
Индексаторы и свойства очень похожи по концепции, но отличаются следующим образом:
Во многих случаях синтаксис 'index' имеет большой смысл. Это особенно полезно, если SomeClass представляет собой некую коллекцию.
Это позволяет выполнять поиск ассоциативных массивов (так же известный как "стиль словаря"), как вы упомянули в своем вопросе.
И в этом весь смысл. Некоторым это нравится, особенно людям, которые приходят из языков, на которых он встроен, таких как Python или PHP
.Ключевое слово this является индексатором
из http://msdn.microsoft.com/en-us/library/6x16t2tx.aspx
«Индексаторы позволяют экземпляры класса или структуры, которые должны индексироваться так же, как массивы. Индексаторы похожи на свойства, за исключением того, что их методы доступа принимают параметры ».
Это перегрузка оператора. Полезно, если вы пишете класс коллекции, например, когда имеет смысл получить к нему доступ, используя нотацию массива, например коллекция [someIndex].
Вы, конечно, можете написать эквивалент функции collection.GetElement (someIndex), но это вопрос стиля / удобочитаемости.
Этот метод можно использовать в классе пар ключ-значение.
Не знаю, что такое аналогичный класс в c#, но в c++ STL есть класс map, в котором вызывается метод с SomeObject["ключ"]
и он возвращает "значение", связанное с этим ключом.
Это называется Indexer, они позволяют использовать List<>, ArrayList, Dictionary<> и все остальные коллекции, использующие синтаксис массивов.
Это просто синтаксический сахар, но он дает некоторую читабельность при правильном использовании.
Возможно, вы уже встречали нечто подобное раньше:
var myList = new List<string>();
myList.Add("One");
myList.Add("Two");
myList.Add("Three");
for(int i = 0; i < myList.Count; i++) {
string s = myList[i];
}
Индексатор - это «первичный ключ» объекта, реализующего коллекцию. Это просто сокращенный способ написания такой функции, как .GetValue (index) - синтаксический сахар, если хотите. Но это также проясняет намерение.
Кажется, что многие ответы сфокусированы на том, что такое индексатор, а не на том, зачем его использовать.
Насколько я понимаю, вот мотивация использования индексатора:
Вы работаете над классом, который имеет какую-то коллекцию, но вы хотите, чтобы этот класс выглядел для пользователей (потребителей класса) так, как если бы он был коллекцией.
Лучший пример, который я могу придумать, это класс DataRow
в ADO.NET. Если вы хотите получить значение пятой ячейки DataRow
, вы можете использовать DataRow.Item[4]
или DataRow[4]
. Последняя форма является удобным и логичным сочетанием клавиш, и довольно хорошо показывает, зачем вам нужен индексатор. Для пользователя DataRow
можно считать просто коллекцией ячеек (хотя на самом деле это нечто большее), поэтому имеет смысл иметь возможность получать и устанавливать значения ячеек напрямую, не задумываясь о том, что вы на самом деле получаете/устанавливаете Item
.
Надеюсь, это поможет.