Как удалить переменную определенного типа из Object [] в C #

У меня есть массив типа Objects, в котором есть информация о переменных разных классов, скажем, ClassA и ClassB.

public object[] SelectedObjects { get; }

Теперь я фильтрую объекты ClassB, которые мне нужно удалить из массива SelectedObjects.

var selectedClassBObjects = SelectedObjects.OfType<ClassB>().ToList();

Когда я выполняю операцию Remove() или RemoveAll(), она ничего не делает.

Кто-нибудь может подсказать мне, как выполнить эту операцию?

Мне нужно удалить объекты ClassB, потому что одновременно может присутствовать только один объект ClassB, когда пользователь пытается выделить объекты на холсте. Сначала удалите объекты ClassB, затем добавьте вновь выбранные объекты ClassB в SelectedObjects[].


person Bhupesh    schedule 03.09.2018    source источник
comment
если вы хотите изменить коллекцию, массив - не лучший выбор; попробуйте List<T>: public List<object> SelectedObjects {get;}; затем SelectedObjects.RemoveAll(item => !(item is ClassB));   -  person Dmitry Bychenko    schedule 03.09.2018
comment
возможно, это поможет вам: stackoverflow.com/questions/496896/   -  person AsfK    schedule 03.09.2018


Ответы (2)


Вы не можете ничего удалить из массива, вам нужно будет создать новый. Если вы хотите исключить объекты типа ClassB, вы можете:

SelectedObjects = SelectedObjects.Where(x => !(x is ClassB)).ToArray();

Если вам нужна изменяемая коллекция, List<T> - лучший выбор, чем массив.

person Selman Genç    schedule 03.09.2018
comment
SelectedObjects {get;} - свойство только для чтения; SelectedObjects = вероятно (если его нет в конструкторе) не будет компилироваться - person Dmitry Bychenko; 03.09.2018
comment
да ладно, я должен все сказать? - person Selman Genç; 03.09.2018

Если вы настаиваете на массиве, вы можете явно указать резервное поле:

private object[] m_SelectedObjects = new object[0];

public object[] SelectedObjects {
  get {
    return m_SelectedObjects;
  }
}

private void MyRemove() {
  // We can't modify read-only property but can operate with its backing field 
  m_SelectedObjects = m_SelectedObjects?.OfType<ClassB>()?.ToArray();
}

Другая возможность - изменить array object[] на List<object>:

public List<object> SelectedObjects { get; }

...

// We still can't assign SelectedObjects but we can modify the collection now
SelectedObjects?.RemoveAll(item => !(item is TypeB));
person Dmitry Bychenko    schedule 03.09.2018