Vin*_*vic 8 c# ienumerable idioms
我经常发现自己做的事情如下:
string[] things = arrayReturningMethod();
int index = things.ToList<string>.FindIndex((s) => s.Equals("FOO"));
//do something with index
return things.Distinct(); //which returns an IEnumerable<string>
Run Code Online (Sandbox Code Playgroud)
我发现所有这些类型/接口混合有点令人困惑,它发现了我潜在的性能问题触角(我忽略了它,直到被证明是正确的,当然).
这是一个惯用的C#还是有更好的替代方法来避免来回使用来访问使用数据的正确方法?
编辑:问题实际上是双重的:
什么时候直接使用IEnumerable接口或数组或列表(或任何其他IEnumerable实现类型)(接受参数时)?
你是否应该在IEnumerables(实现未知)和列表以及IEnumerables和数组以及数组和列表之间自由移动,或者是非惯用的(有更好的方法)/非高性能(通常不相关,但可能在某些情况下)/只是丑陋(不可维护,不可读)?
关于表现......
关于成语......
通常,IEnumerable对公共属性,函数参数以及返回值通常很有用 - 并且只有当您知道要按顺序使用值时才会这样.
例如,如果你有一个函数PrintValues,如果它被写为PrintValues(List <T>值),它只能处理List值,所以用户首先必须转换,如果他们使用的话在[].同样,如果函数是PrintValues(T []值).但如果它是PrintValues(IEnumerable <T>值),它将能够处理Lists,T [],堆栈,哈希表,字典,字符串,集合等 - 任何实现IEnumerable的集合,几乎每个采集.
关于内部使用......
另外,请注意,转换与使用ToArray()或ToList()不同 - 后者涉及复制值,如果您有很多元素,这确实是性能和内存命中.前者只是说"狗是动物,所以像任何动物一样,它可以吃"(垂头丧气)或"这种动物恰好是一只狗,所以它可以吠叫"(向上).同样,All Lists和T []是IEnumerables,但只有一些IEnumerables是Lists或T [] s.
一个好的经验法则是始终使用IEnumerable(当声明变量/方法参数/方法返回类型/属性/等时),除非你有充分的理由不这样做.到目前为止,最类型与其他(特别是扩展)方法兼容.
| 归档时间: |
|
| 查看次数: |
468 次 |
| 最近记录: |