Варианты использования реального мира для индексаторов C#?

Я видел партию примеров для c# Индексаторов, но каким образом будет он помогать мне в реальных ситуациях.

Я знаю, что гуру C# не добавил бы это, если это не была серьезная функция, но я не могу думать о ситуации с реальным миром (не материал панели нечто) для использования индексаторов.

Примечание: Я понимаю, что связанный вопрос существует, но он не помогает мне очень.

44
задан Community 23 May 2017 в 12:02
поделиться

7 ответов

Попробуйте это.

Переместите файл в другой каталог, например тестирование2 .

Это должно быть результатом.

/home/user/Desktop/testing/
/home/user/Desktop/testing/testing2/

Я думаю, что getcwd используется для операций с файлами, где dirname (__ FILE __) использует магическую константу __ FILE __ и использует фактический путь к файлу.


Изменить: я был не прав.

Рабочий каталог можно изменить с помощью chdir .

Так что если вы это сделаете...

chdir('something');
echo getcwd()."\n";
echo dirname(__FILE__)."\n";

Они должны отличаться.

-121--1521529-

Документы здесь сформулированы немного странно, но точны:

Каждое значение в массиве является плавающим пунктом числом между 0,0 и 1,0 и соответствует одному элементу в массиве значений. Каждый элемент массива keyTimes определяет длительность соответствующего значения ключевого кадра как долю от общей длительности анимации. Каждое значение элемента должно быть больше или равно предыдущему значению.

В основном каждое значение указывает, в какой нормализованной точке анимации происходит данный ключевой кадр. Так что если ключевой кадр составляет 25% в анимации, значение будет 0,25. Запутанная часть документов указывает на то, что это длительность, когда на самом деле это нормализованный пункт времени.

-121--3594916-

То, как я смотрю на индексаторы, это (правильно или неправильно!), доступ к чему-либо по индексу должен быть более эффективным, чем доступ к нему каким-либо другим способом, потому что в некотором виде, форме или форме, класс, индексатор которого я использую, хранит некоторую форму индекса , которая позволяет ему быстро искать значения при доступе таким образом.

Классическим примером является массив, при обращении к элементу n массива с помощью миарея кода [3] компилятор/интерпретатор знает, насколько велики (по памяти) элементы массива, и может рассматривать их как смещение от начала массива. Можно также "для (int i = 0; i < myarray.length; i++) {если (i = 3) то {.. dough}} " (не то, что вы когда-либо хотели бы!), что было бы менее эффективно. Он также показывает, как массив является плохим примером.

Скажем, у вас был класс коллекций, который хранит, umm, DVD, так что:

public class DVDCollection
{
    private Dictionary<string, DVD> store = null;
    private Dictionary<ProductId, string> dvdsByProductId = null;

    public DVDCollection()
    {
        // gets DVD data from somewhere and stores it *by* TITLE in "store"
        // stores a lookup set of DVD ProductId's and names in "dvdsByProductid"
        store = new Dictionary<string, DVD>();
        dvdsByProductId = new Dictionary<ProductId, string>();
    }

    // Get the DVD concerned, using an index, by product Id
    public DVD this[ProductId index]  
    {
       var title = dvdsByProductId[index];
       return store[title];
    }
}

Только мой 2p, но, как я сказал,.. Я всегда считал «индексатор» целесообразным способом получения данных из чего-либо.

33
ответ дан 26 November 2019 в 22:02
поделиться

Наиболее очевидными примерами, упомянутыми Скурмеделем, являются List и Dictionary. Что бы вы предпочли:

List<string> list = new List<string> { "a", "b", "c" };
string value = list[1]; // This is using an indexer

Dictionary<string, string> dictionary = new Dictionary<string, string>
{
    { "foo", "bar" },
    { "x", "y" }
};
string value = dictionary["x"]; // This is using an indexer

? Сейчас, может быть, относительно редко Вам нужно написать индексатор (обычно, когда Вы создаете класс, похожий на коллекцию), но я подозреваю, что Вы используете их достаточно часто.

24
ответ дан 26 November 2019 в 22:02
поделиться

Давайте скажем, у вас есть коллекция объектов, которые вы хотите иметь возможность индексировать что-то, кроме того, чтобы он был помещен в коллекцию. В приведенном ниже примере вы можете увидеть, как вы можете использовать свойство «местоположения» некоторых объектов и использование индексатора, вернуть все объекты в коллекции, соответствующую вам местоположение, или во втором примере все объекты, которые содержат определенный счет ( ) объектов.

class MyCollection {

  public IEnumerable<MyObject> this[string indexer] {
    get{ return this.Where(p => p.Location == indexer); }
  }

  public IEnumerable<MyObject> this[int size] {
    get{ return this.Where(p => p.Count() == size);}
  }
}
5
ответ дан 26 November 2019 в 22:02
поделиться

В Microsoft есть пример использования индексатора для трактовки файла как массива байт.

public byte this[long index]
{
    // Read one byte at offset index and return it.
    get 
    {
        byte[] buffer = new byte[1];
        stream.Seek(index, SeekOrigin.Begin);
        stream.Read(buffer, 0, 1);
        return buffer[0];
    }
    // Write one byte at offset index and return it.
    set 
    {
        byte[] buffer = new byte[1] {value};
        stream.Seek(index, SeekOrigin.Begin);
        stream.Write(buffer, 0, 1);
    }
}
9
ответ дан 26 November 2019 в 22:02
поделиться

Как только .NET получила универсальные, самая большая причина для меня, чтобы реализовать индексатора (для реализации категорически напечатанной коллекции) ушел.

5
ответ дан 26 November 2019 в 22:02
поделиться

Если запрос 60K, это признак того, что вы делаете это неправильно.

Нет другого способа упорядочить результирующий набор, кроме использования предложения ORDER BY. Вы можете иметь сложное предложение CASE в своем порядке, снова перечисляя все элементы в предложении IN, но тогда ваш запрос, вероятно, будет 120K.

Я знаю, что вы не хотите, но вы должны поместить значения в предложении IN в таблицу или временную таблицу и присоединиться к ней. Кроме того, во временную таблицу можно включить столбец SortOrder. Базы данных, такие как соединения. Выполнение этого пути поможет выполнить запрос.

-121--1356909-

Поскольку это домашнее задание, я не дам вам полного ответа, но, надеюсь, достаточно, чтобы заставить вас двигаться.

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

Траверсал дает вам 2-7-2-6-5-11-5... и т.д. Обратите внимание, что 5 на самом деле является правильным потомком корня.

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

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


Эффективность:

рассмотрите, сколько раз каждый узел посещается при построении этого дерева, но также рассмотрим операцию считывания входных данных. Есть ли способ реорганизовать входные данные быстрее, чем можно построить дерево? Какую структуру необходимо использовать для обработки данных.


В порядке: Вам понадобится та же идея, чтобы пройти через нее, так что я не буду ее покрывать. Я уверен, что кто-то другой, если ты отчаянно этого хочешь.

-121--4998262-

Это просто синтаксический сахар для классов типа сбора . У меня никогда не было причин писать такой класс. Так что я думаю, что есть очень редкие его применения в «реальной жизни», потому что классы, использующие его, уже реализованы.

3
ответ дан 26 November 2019 в 22:02
поделиться

в ASP.NET, есть несколько разных времен, когда используется индексатор, такой как чтение чего-либо из любого запроса, сеанса или объектов приложений. Я часто видел, где что-то хранится в сеансе или объекте приложения, только для использования снова и снова используется.

3
ответ дан 26 November 2019 в 22:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: