将对象转换为IEnumerable

mom*_*aaa 4 c# ienumerable casting

object selectedDataItem;
MyClass.Inventory inventory;
inventory = (MyClass.Inventory) selectedDataItem;
Run Code Online (Sandbox Code Playgroud)

inventory我们可以看到的细节如下:

Trace.Writeline(inventory.Name + " " + inventory.Place);
Run Code Online (Sandbox Code Playgroud)

你看库存有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;
Run Code Online (Sandbox Code Playgroud)

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

无法将类型为"MyClass.Inventory"的对象强制转换为"System.Collections.Generic.IEnumerable`1 [MyClass.Inventory]".

Eni*_*ity 11

这样做:

var enumerable = new [] { inventory };
Run Code Online (Sandbox Code Playgroud)

  • OP没有问是否有意义,只是如何做到这一点.:-) (2认同)
  • @Aniket - 绝对有道理。`IEnumerable&lt;T&gt;` 可以有零个或多个对象,因此使用单个对象定义可枚举是很有用的,因为它可以过滤到零个对象。这就是 OP 想要做的。这甚至适用于值类型。然后它变得有点等价于 `Nullable&lt;T&gt;`。很多时候这是有用的。 (2认同)

Uri*_*iil 6

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

public static class CustomExtensions
{
    public static IEnumerable<T> ToEnumerable<T>(this T input)
    {
        yield return input;
    }
}
Run Code Online (Sandbox Code Playgroud)


Bha*_*waj 5

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

更新

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

List<MyClass.Inventory> lst = new List<MyClass.Inventory>();
lst.Add(inventory);
Run Code Online (Sandbox Code Playgroud)

然后你可以将你的列表分配给可枚举的,作为

IEnumerable<MyClass.Inventory> enumerable = lst;
Run Code Online (Sandbox Code Playgroud)

参考


Ani*_*nge 1

一般来说,这是一个不好的做法。如果您正在处理的数据不可迭代,那么将其设置为IEnumerable没有意义。

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