Как объединить две коллекции по индексу в LINQ - PullRequest
23 голосов
/ 18 февраля 2010

Что может быть 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]);
}

Ответы [ 3 ]

27 голосов
/ 18 февраля 2010

.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 просто объединит столько элементов, сколько сможет.

Если вы используете .NET 3.5, то вы 'Я должен согласиться на .Select или написать свой собственный метод .Zip.

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

6 голосов
/ 18 февраля 2010

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

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();
4 голосов
/ 18 февраля 2010
object[] objects = values.Select((s,i) => Convert.ChangeType(s, types[i]))
                         .ToArray();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...