Список.NET лучше всего приближается

У меня есть список, который объявляется ниже в запуске, я принимаю значение по умолчанию элементы списка к {-1,-}. обратите внимание на то, что всюду по программе размер списка фиксируется в 2.

List<int> list = new List<int>(new int[] {-1, -1});

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

int x = GetXValue();
int y = GetYValue();

Подход 1:

list = new List<int>(new int[] {x, y});

Подход 2:

list[0] = x;
list[1] = y;

Каков был бы лучший подход? Со вторым подходом, даже при том, что я уверен, существует 2 набора значений первоначально, я могу рискнуть Argument index out of range исключение. Но первый подход мог бы поесть, больше памяти (исправьте меня, если я неправ!), так как я создаю новый список каждый раз.

Есть ли более простое, и/или лучшее решение

7
задан John Saunders 13 August 2010 в 23:22
поделиться

7 ответов

Или есть попроще и лучше решение?

Да. Поскольку список имеет фиксированный размер, используйте реальный объект, например System.Drawing.Point :

Point p = new Point(1, -1);
p = new Point(5, 10);
Console.WriteLine("X = {0}, Y = {1}", p.X, p.Y);
12
ответ дан 6 December 2019 в 12:45
поделиться

Struct тоже может работать

public struct Point
{
    public int X { get; set; }
    public int Y { get; set; }

    public Point(int x, int y):this()
    {
        this.X = x;
        this.Y = y;
    }
}

Point p = new Point(-1, -1);
// ...
p.X = newX;
p.Y = newY;
1
ответ дан 6 December 2019 в 12:45
поделиться

Подход 2 был бы лучше, потому что Подход 1 вызывает ненужное выделение памяти (создание нового списка, массива и т. Д.)

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

1
ответ дан 6 December 2019 в 12:45
поделиться

Возможно, я не понимаю ваш сценарий, но я думаю, что лучшим решением будет простой массив ??

int[] list = new int[] { -1, 1 };
0
ответ дан 6 December 2019 в 12:45
поделиться

Я бы порекомендовал вам использовать массив, что означает, что коллекция остается фиксированного размера, и второй метод доступа к ней. Итак:

int[] array = new[] { -1, -1 };

, а затем изменить его:

array[0] = x;
array[1] = y;

Поскольку массив не меняет размер и ему выделяются 2 значения, вы не получите исключение IndexOutOfRangeException . Обычно я не использую первый метод для изменения содержимого коллекции - в общем случае лучше изменить существующий объект, чем создавать новый.


Кроме того, вы можете написать инициализатор для List , например:

new List<int> {-1, -1};
0
ответ дан 6 December 2019 в 12:45
поделиться

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

class MyClass {
    public MyClass(int x, int y) {
    }
    public int X { get; set; }
    public int Y { get; set; }

    public int[] ToArray() { 
        return new[] { X, Y };
    }
    public List<int> ToList() {
        return ToArray().ToList();
    }
}
1
ответ дан 6 December 2019 в 12:45
поделиться

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

Инкапсуляция должна обеспечивать все варианты поведения, включая запуск с -1, -1 и одновременную установку X и Y . Вы можете сделать что-то вроде этого:

public class ItemSet
{
    public ItemSet()
    {
        this.X = -1;
        this.Y = -1;
    }

    public int X { get; private set; }

    public int Y { get; private set; }

    public void SetItems(int x, int y)
    {
        this.X = x;
        this.Y = y;
    }
}
1
ответ дан 6 December 2019 в 12:45
поделиться
Другие вопросы по тегам:

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