【问题标题】:Convert SelectedObjectCollection to Collection of Specific Type将 SelectedObjectCollection 转换为特定类型的集合
【发布时间】:2013-06-28 06:53:22
【问题描述】:

我有一个 WinForms 多选列表框,列表框中的每个项目都是 MyClass 类型。

我也在写一个方法,它需要一个参数,它是MyClass 的集合。它可以是MyClass[]List<MyClass>IList<MyClass>IEnumerable<MyClass> 等类型。其中任何一个都可以正常工作。

不知何故,我需要将列表框中的选定项目传递给我的方法。但是如何将SelectedObjectCollection 转换为上述任何MyClass 集合类型?

【问题讨论】:

    标签: c# winforms collections type-conversion


    【解决方案1】:

    也许这会有所帮助:

    IEnumerable<MyClass> items = yourListBox.SelectedItems.Cast<MyClass>();
    

    【讨论】:

      【解决方案2】:

      一个问题是ListBox 项目不是通用列表,因此它可能包含多个类型。如果您调用.AsQueryable,当您调用.Select() 时,您正在对非类型安全的集合进行显式转换,调用.Cast&lt;T&gt; 也是如此,因为您可能会遇到转换异常。更安全的方法是使用.OfType&lt;T&gt;()

      IEnumerable<MyClass> selected = listBox.SelectedItems.OfType<MyClass>();
      

      【讨论】:

        【解决方案3】:

        你可以试试 Linq:

        yourSelectedObjectCollection.AsQueryable().Select(o=>(MyClass)o).ToArray()
        

        【讨论】:

        • Select()转成Queryable对象后没有方法
        【解决方案4】:

        我的 TreeView 也有同样的问题,它包含 2 个不同的类。

        if(SelectedItem is MyClass)
        {
            MyClass passvariable = (MyClass)SelectedItem;
        }
        

        因此,如果您选择一个项目并且该项目的类型是 MyClass,那么您将创建一个新变量并将 SelectedItem 设置为 MyClass 类型。

        您可以对 Collection、List、... 执行相同操作

        if(MyList is ObservableCollection<MyClass>)
        {
            ObservableCollection<MyClass> passlist = (ObservableCollection<MyClass>)MyList;
        }
        

        如果您在 ListBox、ComboBox 中拥有超过 1 个类...只需使用 if(... is type) 检查 SelectedItem

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-06-10
          • 2021-01-11
          • 1970-01-01
          • 2018-10-26
          • 1970-01-01
          • 1970-01-01
          • 2010-10-30
          相关资源
          最近更新 更多