С# Cast Весь массив?
Я вижу этот метод Array.ConvertAll
, но для него требуется Converter
. Я не понимаю, зачем мне нужен конвертер, когда я уже определил неявный в своем классе:
public static implicit operator Vec2(PointF p)
{
return new Vec2(p.X, p.Y);
}
Я пытаюсь передать массив PointF
в массив Vec2
s. Есть ли хороший способ сделать это? Или я должен просто отсосить его и написать (другой) конвертер или цикл над элементами?
Ответы
Ответ 1
Предлагаемое решение LINQ с использованием Cast
/'Select' отлично, но поскольку вы знаете, что работаете с массивом здесь, использование ConvertAll
является скорее более эффективным и простым.
var newArray = Array.ConvertAll(array, item => (NewType)item);
Использование ConvertAll
означает a) массив повторяется только один раз, а не дважды, b) операция более оптимизирована для массивов (не использует IEnumerator<T>
).
Не допускайте, чтобы тип Converter<TInput, TOutput>
путал вас - это просто простой делегат, и поэтому вы можете передать ему лямбда-выражение, как показано выше.
Ответ 2
В качестве обновления к этому старому вопросу вы можете:
myArray.Cast<Vec2>().ToArray();
где myArray содержит исходные объекты, а Vec2 - тип, который вы хотите использовать.
Ответ 3
В ролях не учитываются неявные преобразования, определенные пользователем, поэтому вы не можете использовать такой массив. Вместо этого вы можете выбрать select:
myArray.Select(p => (Vec2)p).ToArray();
Или напишите конвертер:
Array.ConvertAll(points, (p => (Vec2)p));
Последнее, вероятно, более эффективно, поскольку размер результата известен заранее.