What is the easiest and most compact way to create a IEnumerable<T> or ICollection<T>?
所以,很多时候我们有一个函数接受IEnumerable或ICollection作为参数。如果我们有单个项,但没有集合来保存它们,则必须在将它们传递给函数之前创建集合,例如:
1 2 |
我总是创建一个数组或列表,就像我在上一个示例中所做的那样。但是我想知道,有没有一种更优雅的方式来创建所需的IEnumerable或ICollection?
如果你能做到这一点,那就太酷了:
1 | Foo({ o1, o2, o3 }); |
编译器将创建尽可能抽象的集合,以满足IEnumerable或ICollection的需要(取决于函数接受哪个集合)。
总之,如何将o1、o2和o3传递给IEnumerable或ICollection参数?
当前版本的C(3)支持不带显式类型的表示法,即
1 |
创建数组。还有Linq的
1 2 3 | public static IEnumerable<T> AsList<T>(params T[] values) { return values; } |
这样称呼:
1 | Foo(Enumerable.AsList(o1, o2, o3)); |
有时我使用了一个带有"params"参数的方法。
1 | Foo(params T[] ts) |
如果我已经对IEnumerable有了固定的设置,我只需要将该方法委托给想要IEnumerable的方法。
1 | Foo(params T[] ts) { Foo(ts.AsEnumerable()); } |
你必须打一个可数的电话,否则你会再次出现。
创建一个数组并传递,这可能是在当前版本的C_中实现这一点的最简单/最优雅的方法。您可以利用隐式数组类型(即
我怀疑你真的在寻找这个f语法的c等价物:
1 | let foo = seq [ o1; o2; o3 ] |
它生成一个将在指定元素上迭代的
不幸的是,由于这是一个基本的功能性概念,所以没有C等价物——尽管谁知道何时会添加它,因为C变得越来越功能性。
假设foo需要IEnumerable,则可以利用类型推断并执行以下操作:
1 2 |
如果有一个方法将数组作为其最后一个参数,那么标记该参数
1 | Foo(o1, o2, o3); |
我发现这在为
我建议不要这样做,如果有一个
我希望C语言允许
1 | void Foo(params IList<T> ts) { ... } |