Я почти уверен, что решение @ Hightechrider наиболее эффективно, чем это, но если вам действительно нравится синтаксический подход, вы можете сделать это так:
public IDictionary<int, int> MergeSequences(IEnumerable<int>[] value1ByType, Dictionary<int, int> value2ToType)
{
int pos = 0;
var value1ByTypePos = from byType in value1ByType
select new { Pos = pos++, Enumerator = byType.GetEnumerator() };
return (from byType in value1ByTypePos
join toType in value2ToType
on byType.Pos equals toType.Value
select new { toType.Key, Value = byType.Enumerator.GetNext() })
.ToDictionary(pair => pair.Key, pair => pair.Value);
}
Я добавил метод расширения в интерфейс IEnumerator следующим образом:
public static T GetNext<T>(this IEnumerator<T> enumerator)
{
if (!enumerator.MoveNext())
throw new InvalidOperationException();
return enumerator.Current;
}
Теперь вы должны знать, что любое из этих решений может дать вам немного разные результаты, в зависимости от того, как перечисляются элементы в словаре. Например, другой допустимый результат для этого кода:
var value2ToValue1 = new Dictionary<int,int> {
{100, 0},
{103, 10},
{102, 20},
{101, 11}};
Обратите внимание, что теперь 101 в паре с 11 и 103 в паре с 10. Если это проблема, тогда вам следует использовать SortedDictionary<int, int>
при определении переменной value2ToType.