Это очень неэффективно на данный момент - все эти вызовы ElementAt могут проходить всю последовательность (насколько им нужно) каждый раз. (Это зависит от реализации последовательности.)
Однако я совсем не уверен, что даже понимаю, что делает этот код (использование циклов foreach почти наверняка сделает его более понятным, как и итерация вперед, а не назад. Не могли бы вы дать пример ввода?
РЕДАКТИРОВАТЬ: Хорошо, я думаю, что я вижу, что здесь происходит; вы эффективно разворачиваете ValueCollections. Я подозреваю, что вы захотите что-то вроде:
static Dictionary<int, string[]> MergeArrays(
IEnumerable<int> idCollection,
params IEnumerable<string>[] valueCollections)
{
var valueCollectionArrays = valueCollections.Select
(x => x.ToArray()).ToArray();
var indexedIds = idCollection.Select((Id, Index) => new { Index, Id });
return indexedIds.ToDictionary(x => Id,
x => valueCollectionArrays.Select(array => array[x.Index]).ToArray());
}
Это довольно уродливо, хотя. Если вы можете сделать idCollection массивом для начала, это было бы откровенно проще.
РЕДАКТИРОВАТЬ: Хорошо, предполагая, что мы можем использовать массивы вместо:
static Dictionary<int, string[]> MergeArrays(
int[] idCollection,
params string[][] valueCollections)
{
var ret = new Dictionary<int, string[]>();
for (int i=0; i < idCollection.Length; i++)
{
ret[idCollection[i]] = valueCollections.Select
(array => array[i]).ToArray();
}
return ret;
}
Я исправил (надеюсь) ошибку в первой версии - я запутался в том, какой бит значений является массивом, а какой нет. Вторая версия не так декларативна, но, на мой взгляд, она понятнее.