C #: поиск и изменение элемента в массиве структуры - PullRequest
2 голосов
/ 11 февраля 2012

У меня есть структура TableRow и массив таблица таких структур:

table = new TableRow[10];

Теперь я хочу найти и манипулировать содержимым одного изструктуры в массиве.
Я использую Array.Find для поиска нужного элемента массива:

var tr = Array.Find( table, tRow => tRow.color == 'red' );
tr.count++;

Проблема в том, что структуры являются типами значений, и поэтому метод Find возвращает копию структуры, которой я хочу манипулировать.Изменение этой копии не меняет структуру в массиве.

Кажется, я не могу найти какой-либо способ дать указание методу Find вернуть структуру по ссылке.

Ответы [ 3 ]

4 голосов
/ 11 февраля 2012

Вы не можете изменить способ работы Find() для типов значений.Вы можете конвертировать struct в class - обычно мы используем struct только для очень маленьких (<= 16 байт) типов значений, которые в любом случае представляют собой «одно» значение.MSDN дает хорошее руководство по <code>struct против class здесь: Выбор между классами и структурами

Или вы можете использовать FindIndex(), чтобы получить позицию в массиве, а затем использовать этоизменить поле.

var pos = Array.FindIndex(table, tRow => tRow.color == 'red');

if (pos >= 0)
{
    table[pos].count++
}
3 голосов
/ 11 февраля 2012

Вы можете использовать FindIndex, чтобы получить нулевой индекс соответствующего элемента и изменить его вместо этого.

int i = Array.FindIndex(table, tRow => tRow.color == 'red');
table[i].count++;

Однако рекомендуется, чтобы структуры (почти всегда) были неизменными.По предоставленной MSDN ссылке @James (выделение добавлено):

Не определяйте структуру, если тип не имеет всех следующих характеристик:

  • Логическипредставляет одно значение, аналогичное типам примитивов (целое, двойное и т. д.).
  • Размер экземпляра меньше 16 байт.
  • Он неизменен.
  • Это не должно быть часто в штучной упаковке.

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

2 голосов
/ 11 февраля 2012

Поскольку структуры являются типами значений, вы должны создать новый экземпляр TableRow и заменить им нужный элемент. Вы можете использовать Array.FindIndex, чтобы найти индекс вашего элемента.

...