У меня есть список, который объявляется ниже в запуске, я принимаю значение по умолчанию элементы списка к {-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
исключение. Но первый подход мог бы поесть, больше памяти (исправьте меня, если я неправ!), так как я создаю новый список каждый раз.
Есть ли более простое, и/или лучшее решение
Или есть попроще и лучше решение?
Да. Поскольку список имеет фиксированный размер, используйте реальный объект, например System.Drawing.Point :
Point p = new Point(1, -1);
p = new Point(5, 10);
Console.WriteLine("X = {0}, Y = {1}", p.X, p.Y);
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;
Подход 2 был бы лучше, потому что Подход 1 вызывает ненужное выделение памяти (создание нового списка, массива и т. Д.)
Однако тот факт, что в вашем списке только 2 элемента, заставляет меня думать, что список - неправильный класс для использования в вашем сценарии.
Возможно, я не понимаю ваш сценарий, но я думаю, что лучшим решением будет простой массив ??
int[] list = new int[] { -1, 1 };
Я бы порекомендовал вам использовать массив, что означает, что коллекция остается фиксированного размера, и второй метод доступа к ней. Итак:
int[] array = new[] { -1, -1 };
, а затем изменить его:
array[0] = x;
array[1] = y;
Поскольку массив не меняет размер и ему выделяются 2 значения, вы не получите исключение IndexOutOfRangeException
. Обычно я не использую первый метод для изменения содержимого коллекции - в общем случае лучше изменить существующий объект, чем создавать новый.
Кроме того, вы можете написать инициализатор для List
, например:
new List<int> {-1, -1};
почему не пользовательский класс, что-то вроде, тем более, что это фиксированный размер.
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, -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;
}
}