【问题标题】:Cast object to IEnumerable将对象转换为 IEnumerable
【发布时间】:2014-05-21 05:28:53
【问题描述】:
object selectedDataItem;
MyClass.Inventory inventory;
inventory = (MyClass.Inventory) selectedDataItem;

inventory我们可以看到详情如:

Trace.Writeline(inventory.Name + " " + inventory.Place);

您看到库存有inventory.Name、Inventory.Place 我想将所有属性包装在IEnumerable 或ObservableCollection 中,这样我就可以一次遍历所有库存,而不是通过inventory.Name、inventory.Place 等...

我怎样才能制作库存IEnumerable 以便我可以做这样的事情:

IEnumerable<MyClass.Inventory> enumerable = (IEnumerable<MyClass.Inventory>) inventory;
enumerable = from x in enumerable where x.Name == inventory.Name select x;

现在如果我这样做,错误是

无法将“MyClass.Inventory”类型的对象转换为“System.Collections.Generic.IEnumerable`1[MyClass.Inventory]”类型。

【问题讨论】:

  • 'selectedDataItem' 是数组还是单个对象?如果要将单个对象转换为 IEnumerable,则应将 IEnumerable 接口实现为“Inventory”类。
  • MyClass.Inventory 没有实现 IEnumerable&lt;MyClass.Inventory&gt;。这对我来说毫无意义,你为什么希望将单个项目投射到IEnumerable

标签: c# casting ienumerable


【解决方案1】:

这样做:

var enumerable = new [] { inventory };

【讨论】:

  • 那会编译但没有意义。
  • OP 没有问它是否有意义,只是问如何去做。 :-)
  • 这就是问题所在,当数据只是一个对象时,使用 IEnumerable 有什么意义。
  • @Aniket - 肯定有一点。 IEnumerable&lt;T&gt; 可以有零个或多个对象,因此使用单个对象定义一个可枚举是有用的,因为它可以被过滤到零个对象。这就是 OP 想要做的。这甚至适用于值类型。然后它变得有点等同于Nullable&lt;T&gt;。很多时候这很有用。
【解决方案2】:

不知道你为什么需要这个,但是一旦我看到了下一个扩展方法:

public static class CustomExtensions
{
    public static IEnumerable<T> ToEnumerable<T>(this T input)
    {
        yield return input;
    }
}

【讨论】:

    【解决方案3】:

    inventory 是类MyClass.Inventory 的一个实例,它不是一个可枚举的列表,因此您可以直接转换它。如果您真的想要一个带有该对象的可枚举,那么您需要创建一个空的可枚举并将该对象添加到其中。

    更新

    您必须先创建一个List 并将您的对象添加到该列表中,例如,

    List<MyClass.Inventory> lst = new List<MyClass.Inventory>();
    lst.Add(inventory);
    

    然后您可以将您的列表分配给可枚举,如

    IEnumerable<MyClass.Inventory> enumerable = lst;
    

    reference

    【讨论】:

    • 创建一个接口对象?
    • new IEnumerable&lt;MyClass.Inventory&gt;() ?
    【解决方案4】:

    一般来说,这是一种不好的做法。如果您正在处理的数据不可迭代,则将其设为 IEnumerable 毫无意义。

    另一方面,如果您仍想使用IEnumerable&lt;T&gt;,请使用List&lt;T&gt;,将您的对象存储在其中,然后执行LINQ 查询!

    【讨论】:

    • 我不知道为什么这被否决了,到目前为止,这是解决底层类型不可迭代 +1的核心问题的答案
    猜你喜欢
    • 2012-06-02
    • 2013-07-04
    • 1970-01-01
    • 1970-01-01
    • 2016-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多