作为一名新的.NET 3.5程序员,我开始学习LINQ,我发现了一些非常基本的东西,我之前没有注意到:
本书声称每个数组实现IEnumerable<T>(显然,否则我们不能使用LINQ到数组上的对象......).当我看到这个时,我心里想,我从未真正想过这个,我问自己所有数组实现了什么 - 所以我检查了
System.Array使用对象浏览器(因为它是CLR中每个数组的基类),并且我很惊讶,它没有实现IEnumerable<T>.
所以我的问题是:定义在哪里?我的意思是,我怎么能准确地告诉每个阵列实现哪些接口?
我们使用的是一个对3D测量数据进行计算的类库,它公开了一个方法:
MeasurementResults Calculate(IList<IList<Measurement>> data)
Run Code Online (Sandbox Code Playgroud)
我想允许使用任何可索引的列表列表(当然是Measurement)调用此方法,例如:
Measurement[][] array;
List<List<Measurement>> list;
Run Code Online (Sandbox Code Playgroud)
使用数组调用方法工作正常,这有点奇怪.这里有一些编译技巧吗?试着打电话List给出了熟悉的错误:
cannot convert from 'List<List<Measurement>>' to 'IList<IList<Measurement>>'
Run Code Online (Sandbox Code Playgroud)
所以,我编写了一个facade类(包含其他一些东西),使用一个方法在参数和方法之间拆分泛型定义,并在必要时转换为IList类型:
MeasurementResults Calculate<T>(IList<T> data) where T : IList<Measurement>
{
IList<IList<Measurement>> converted = data as IList<IList<Measurement>>;
if(converted == null)
converted = data.Select(o => o as IList<Measurement>).ToList();
return Calculate(converted);
}
Run Code Online (Sandbox Code Playgroud)
这是解决问题的好方法,还是你有更好的想法?
此外,在测试问题的不同解决方案时,我发现如果已经使用IEnumerable而不是声明类库方法IList,则可以使用数组和以下方法调用该方法List:
MeasurementResults Calculate(IEnumerable<IEnumerable<Measurement>> data)
Run Code Online (Sandbox Code Playgroud)
我怀疑有一些编译器技巧再次出现,我想知道为什么他们没有在他们IList工作的List时候合作?