【问题标题】:How to remove variable of Specific Type from Object[] in C#如何从 C# 中的 Object[] 中删除特定类型的变量
【发布时间】:2019-02-08 07:59:37
【问题描述】:

我有一个Objects 类型的数组,其中包含不同类的变量信息,例如ClassAClassB

public object[] SelectedObjects { get; }

现在我正在过滤 ClassB 的对象,我需要从 SelectedObjects 的数组中删除这些对象。

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

当我执行Remove()RemoveAll()的操作时,它什么都不做

谁能建议我如何执行此操作?

我需要删除ClassB 的对象,因为当用户尝试突出显示画布上的对象时,一次只能出现ClassB 的一个对象。首先删除ClassB对象,然后将新选择的ClassB对象添加到SelectedObjects[]

【问题讨论】:

  • 如果要修改集合,数组不是一个好的选择;试试List&lt;T&gt;public List&lt;object&gt; SelectedObjects {get;};然后SelectedObjects.RemoveAll(item =&gt; !(item is ClassB));
  • 也许这会对你有所帮助:stackoverflow.com/questions/496896/…

标签: c# arrays removeall


【解决方案1】:

您无法从数组中删除任何内容,您需要创建一个新数组。如果你想排除 ClassB 类型的对象,你可以这样做:

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

如果您想要一个可修改的集合,List&lt;T&gt; 是比数组更好的选择。

【讨论】:

  • SelectedObjects {get;}只读属性; SelectedObjects = 可能(如果它不在构造函数中)不会编译
  • 是的,我必须说完所有内容吗?
【解决方案2】:

如果你坚持使用 array,你可以明确地放置 backing field

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&lt;object&gt;

public List<object> SelectedObjects { get; }

...

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    • 2020-12-18
    • 2015-06-30
    • 2022-11-30
    相关资源
    最近更新 更多