ConverAll的正确使用方法是什么?它会将一种类型转换为另一种类型吗?
喜欢
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&lt;&gt;。
答案 0 :(得分:7)
ConvertAll
不是扩展方法,它是List<T>
本身的真实方法。
它返回一个包含已转换元素的新列表。因此,在您的示例中,query
变量实际上不是查询,而是List<double>
。
Cast
和OfType
是扩展方法,可在IEnumerable
上运行并返回IEnumerable<T>
。但是,它们不适合您的声明目的:Cast
可以转换引用类型,但无法转换值类型,只能取消它们。 OfType
不执行任何转换,只返回已经指定类型的任何元素。
答案 1 :(得分:2)
ConvertAll
只会为列表中的每个元素调用您的委托/匿名方法。这样做完全取决于你。
在您发布的示例代码中,它会尝试将每个元素转换为double并返回该元素,这意味着您将获得List<Double>
作为回报。
您不应该使用OfType<T>
,因为这会根据类型过滤元素,并且如果由于继承或接口实现而类型兼容,则只返回与原始类型不同的类型。
换句话说,.OfType<Double>
将不返回任何元素,因为没有一个整数也是双倍的。
答案 2 :(得分:1)
ConvertAll
是投影操作符,并且最接近LINQ的Select
。 LINQ的Cast
是一个特定的投影操作符,表示你做了[通过投影] - 或者它会(如路加的回答[和评论]中指出的那样,如果你没有转换)到值类型。
一般来说,LINQ有一套更完整且经过深思熟虑的运算符,这使得像ConvertAll
这样的旧东西有时看起来有些愚蠢[像这样]。 (或@stoopid:D)。
答案 3 :(得分:0)
OfType<T>
只返回集合中具有指定类型T的元素。
ConvertAll允许您将元素转换为另一种类型。