.NET List лучший подход - PullRequest
       9

.NET List лучший подход

7 голосов
/ 14 августа 2010

У меня есть список, который объявлен ниже, в начале я по умолчанию элементы списка в {-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 ]

12 голосов
/ 14 августа 2010

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

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

Point p = new Point(1, -1);
p = new Point(5, 10);
Console.WriteLine("X = {0}, Y = {1}", p.X, p.Y);
1 голос
/ 14 августа 2010

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

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

1 голос
/ 14 августа 2010

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 голос
/ 14 августа 2010

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

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 голос
/ 14 августа 2010

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

Инкапсуляция должна обеспечивать все варианты поведения, в том числе начиная с -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;
    }
}
0 голосов
/ 14 августа 2010

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

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

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

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

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


Так же, как в стороне, вы можете написатьинициализатор для List<T> типа:

new List<int> {-1, -1};
0 голосов
/ 14 августа 2010

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

int[] list = new int[] { -1, 1 };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...