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

Как объединить две коллекции по индексу в LINQ

Что может быть LINQ эквивалентно следующему коду?

string[] values = { "1", "hello", "true" };
Type[] types = { typeof(int), typeof(string), typeof(bool) };

object[] objects = new object[values.Length];

for (int i = 0; i < values.Length; i++)
{
    objects[i] = Convert.ChangeType(values[i], types[i]);
}
4b9b3361

Ответ 1

У .NET 4 есть Zip-оператор, который позволяет вам объединить две коллекции.

var values = { "1", "hello", "true" };
var types = { typeof(int), typeof(string), typeof(bool) };
var objects = values.Zip(types, (val, type) => Convert.ChangeType(val, type));

Метод .Zip превосходит .Select((s, i) = > ...), потому что .Select генерирует исключение, когда ваши коллекции не имеют одинакового количества элементов, тогда как .Zip будет просто zip вместе как можно больше элементов.

Если вы используете .NET 3.5, вам придется согласиться на выбор. Выберите или напишите свой собственный метод .Zip.

Теперь, все, что сказал, я никогда не использовал Convert.ChangeType. Я предполагаю, что это работает для вашего сценария, поэтому я оставлю это.

Ответ 2

Предполагая, что оба массива имеют одинаковый размер:

string[] values = { "1", "hello", "true" };
Type[] types = { typeof(int), typeof(string), typeof(bool) };

object[] objects = values
    .Select((value, index) => Convert.ChangeType(value, types[index]))
    .ToArray();

Ответ 3

object[] objects = values.Select((s,i) => Convert.ChangeType(s, types[i]))
                         .ToArray();