Можно ли зациклить ввод в массив без установки размера массива в C #? - PullRequest
3 голосов
/ 26 января 2010

Это, наверное, очень простой вопрос, но я нигде не могу найти ответ.

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

Есть ли способ просто циклически проходить и иметь количество элементов массива, зависящее от количества входов?

ТИА

Ответы [ 5 ]

8 голосов
/ 26 января 2010

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

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

3 голосов
/ 26 января 2010

Если вы знаете длину ввода, вы можете инициализировать массив этим значением. В противном случае вы должны использовать List для строго типизированной коллекции или ArrayList .

Если ваш ввод IEnumerable, вы можете использовать List.AddRange , чтобы добавить все значения без необходимости зацикливания.

Обратите внимание, что List и ArrayList работают именно так, как вы хотите. Как говорится в документации, они используют «массив, размер которого динамически увеличивается по мере необходимости».

0 голосов
/ 26 января 2010

И, что еще лучше, по возможности используйте общие списки . Так как они вышли в 2.0, я не думаю, что когда-либо использовал простой ArrayList.

List<string> myNames = new List<string>();
myNames.Add("kevin");
string[] myNamesTurnedToStringArray = nyMames.ToArray();

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

public class Widgets : List<Widgets> // Widgest class defined elsewhere
{
    public Widgets() : base() {}
    public Widgets(IEnumerable<Widgets> items) : base(items) {}

    public Widget GetWidgetById(int id)
    {
        // assuming only one ID possible
        return this.Where(w => w.id == id).Single(); 
    }

    public string[] GetAllNames()
    {
        return this.Select(w => w.Name).ToArray();
    }
}

//... later in some other class ....

Widgets w = new Widgets(dataFromDatabase);
Widget customerWidget = w.GetWidgetById(customerWidgetId);
string[] allNames = w.GetAllNames();

Это хороший ООП-способ инкапсулирования вашей функциональности списка в одном месте, и часто это отличный способ органично разделить ваши проблемы.

0 голосов
/ 26 января 2010

взгляните на коллекцию ArrayList . Вы можете присвоить ему начальный размер размещения, а также можете Add элементов к нему.

Емкость ArrayList - это количество элементов, которое может содержать ArrayList. Когда элементы добавляются в ArrayList, емкость автоматически увеличивается по мере необходимости путем перераспределения. Емкость можно уменьшить, вызвав TrimToSize или явно указав свойство Capacity.

Конечно, будет более эффективно предварительно выделить его до разумного размера, чем добавлять элементы по одному из 0 - но это будет работать в любом случае.

0 голосов
/ 26 января 2010

Вы хотите использовать List.

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