Подтвердить что ты не робот

С# Cast Весь массив?

Я вижу этот метод Array.ConvertAll, но для него требуется Converter. Я не понимаю, зачем мне нужен конвертер, когда я уже определил неявный в своем классе:

    public static implicit operator Vec2(PointF p)
    {
        return new Vec2(p.X, p.Y);
    }

Я пытаюсь передать массив PointF в массив Vec2 s. Есть ли хороший способ сделать это? Или я должен просто отсосить его и написать (другой) конвертер или цикл над элементами?

4b9b3361

Ответ 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));

Последнее, вероятно, более эффективно, поскольку размер результата известен заранее.