You can use Enumerable.Zip :
IEnumerable<Info> InfoSrc = s1.Split(',') .Zip(s2.Split(','), (name, num) => new Info(){ Name = name, Num = num });
If you need to map more than two collections for properties, you can bind multiple Zip along with an anonymous type by holding the second and third:
IEnumerable<Info> InfoSrc = s1.Split(',') .Zip(s2.Split(',').Zip(s3.Split(','), (second, third) => new { second, third }), (first, x) => new Info { Name = first, Num = x.second, Prop3 = x.third });
Here, I hope, a more readable version:
var arrays = new List<string[]> { s1.Split(','), s2.Split(','), s3.Split(',') }; int minLength = arrays.Min(arr => arr.Length); // to be safe, same behaviour as Zip IEnumerable<Info> InfoSrc = Enumerable.Range(0, minLength) .Select(i => new Info { Name = arrays[0][i], Num = arrays[1][i], Prop3 = arrays[2][i] });