2009-12-16 142 views
2

什么是ConverAll的正确使用?它会将一种类型转换为另一种类型吗?扩展方法ConvertAll

List<int> intList = new List<int>(); 
intList.Add(10); 
intList.Add(20); 
intList.Add(30); 
intList.Add(33); 

var query= intList.ConvertAll(x=>(double)x); 

此我可以使用铸造或OfType <>。

回答

7

ConvertAll不是扩展方法,它是List<T>本身的真实方法。

它返回一个包含转换元素的新列表。因此,在您的示例中,query变量实际上不是查询,而是List<double>

CastOfType是在IEnumerable操作,并返回一个IEnumerable<T>扩展方法。但是它们不适合你陈述的目的:Cast可以转换参考类型,但不可以转换值类型,只解开它们。 OfType不执行任何转换,它只是返回已经具有指定类型的任何元素。

0

据我所知,OfType<T>将只返回集合中指定类型为T的元素。 ConvertAll允许您将元素转换为另一种类型。

2

ConvertAll将只为列表的每个元素调用您的委托/匿名方法。这做什么完全取决于你。

在您发布的示例代码中,它会尝试将每个元素转换为double并返回该元素,这意味着您将获得List<Double>作为回报。

您不应该使用OfType<T>,因为这将根据类型过滤元素,并且由于继承或接口实现,只会返回与原始类型不同的类型。

换句话说,.OfType<Double>将不返回任何元素,因为没有任何整数也是双精度。

1

ConvertAll是投影算子,与LINQ的Select最接近。 LINQ的Cast是一个特定的投影算子,代表你正在做[通过投影] - 或者它会(如Luke的答案[和评论]中指出的那样,I + 1'd)如果你没有转换为值类型。

一般来说,LINQ有一个更加完整和深思熟虑的操作符集合,这使得像ConvertAll这样的旧的东西有时看起来有点愚蠢[像这样]。 (或@stoopid:D)。

+0

'Cast'方法不适合OP要做的事情。对于值类型转换(例如,从'int'到'double'),'Cast' *不起作用。 'Cast'方法只能取消值类型,不能转换它们。 – LukeH 2009-12-16 11:21:52

+0

里程远远超过了你(编辑时已经阅读了你的编辑内容 - 感谢你做了这个spadework!):P(你的回答非常好 - 我只是在它存在之前就打扰回答) – 2009-12-16 11:25:27