Метод расширения ConvertAll - PullRequest
       14

Метод расширения ConvertAll

2 голосов
/ 16 декабря 2009

Как правильно использовать 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 <>.

Ответы [ 4 ]

7 голосов
/ 16 декабря 2009

ConvertAll не является методом расширения, это реальный метод для List<T>.

Возвращает новый список, содержащий преобразованные элементы. Так что в вашем примере переменная query на самом деле не является запросом, это List<double>.

Cast и OfType - это методы расширения, которые работают на IEnumerable и возвращают IEnumerable<T>. Однако они не подходят для вашей заявленной цели: Cast может преобразовывать ссылочные типы, но не может преобразовывать типы значений, только распаковывать их. OfType не выполняет никакого преобразования, он просто возвращает элементы, которые уже имеют указанный тип.

2 голосов
/ 16 декабря 2009

ConvertAll просто вызовет ваш делегат / анонимный метод для каждого элемента списка. Что это делает, зависит только от вас.

В приведенном вами примере кода он попытается привести каждый элемент к двойному значению и вернуть его, что означает, что вы получите List<Double> взамен.

Не следует использовать OfType<T>, так как это отфильтрует элементы на основе типа и будет возвращать тип, отличный от исходного, только если он совместим с типом из-за наследования или реализации интерфейса.

Другими словами, .OfType<Double> не вернет никаких элементов, поскольку ни одно из целых чисел также не является двойным.

1 голос
/ 16 декабря 2009

ConvertAll является оператором проекции и наиболее близко соответствует LINQ Select. Cast LINQ - это конкретный оператор проекции, представляющий выполнение того, что вы сделали [через проекцию] - или было бы (как указано в ответе [и комментариях] Люка, который я + 1), если бы вы не конвертировали в тип значения.

В целом, LINQ имеет более полный и продуманный набор операторов, что делает старые вещи вроде ConvertAll временами выглядят немного глупо [как это]. (или @ stoopid : D).

0 голосов
/ 16 декабря 2009

Насколько мне известно, OfType<T> будет возвращать только элементы в коллекции, которые имеют указанный тип T. ConvertAll позволяет преобразовывать элементы в другой тип.

...