Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to concatenate two collections by index in LINQ

Tags:

What could be a LINQ equivalent to the following code?

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]); } 
like image 905
tpol Avatar asked Feb 18 '10 15:02

tpol


2 Answers

.NET 4 has a Zip operator that lets you join two collections together.

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

The .Zip method is superior to .Select((s, i) => ...) because .Select will throw an exception when your collections don't have the same number of elements, whereas .Zip will simply zip together as many elements as it can.

If you're on .NET 3.5, then you'll have to settle for .Select, or write your own .Zip method.

Now, all that said, I've never used Convert.ChangeType. I'm assuming it works for your scenario, so I'll leave that be.

like image 105
Judah Gabriel Himango Avatar answered Mar 20 '23 09:03

Judah Gabriel Himango


Assuming both arrays have the same size:

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(); 
like image 27
Darin Dimitrov Avatar answered Mar 20 '23 08:03

Darin Dimitrov