2015-01-22 6 views
0

я должен осуществить это расширение-методаПрименение селекторов на пары элементов, возможно, бесконечных последовательностей С #

public static IEnumerable<TResult> MyMerge<T1, T2, TResult>(this IEnumerable<T1> s1, IEnumerable<T2> s2, Func<T1, T2, TResult> f) 

, что возвращает последовательность F (x1, y1), F (x2, y2), где ... все xn являются элементами s1 и все yn являются элементами s2.

Моя проблема заключается в том, что эта последовательность должна иметь одинаковую длину кратчайшей последовательности, и оба s1 и s2 могут быть бесконечными. Если бы они были не такими, я мог бы сделать

var res = new List<TResult>(); 
for (var i = 0; i<Math.Min(s1.Count(), s2.Count()) ; i++) 
{ 
    res.Add(f(s1.ToArray()[i], s2.ToArray()[i])); 
} 
return res; 

, но это также приводит к тому, что одна последовательность длиннее другой. Как я могу это решить?

+0

В коде, который у вас есть, на каждой итерации (то есть для каждого элемента в наименьшей последовательности) вы просматриваете * целые * из * последовательности *, чтобы подсчитать их размер, затем вы копируете каждый отдельный элемент в обеих последовательностях к новым массивам, чтобы просто вытащить * один * элемент из каждого массива. Это будет крайне неэффективно. Простое копирование значений в массивы * один раз * проблематично; делаю это за каждый предмет, который вы получаете .... – Servy

+0

@Servy Ehmm да, допустим, у меня есть много, чтобы улучшить обработку последовательностей :) – Sanci

ответ

5

. У .NET уже есть реализация этого точных функциональности, Enumerable.Zip.

Что касается того, как его реализовать, если вы хотите сделать это самостоятельно, это довольно просто. Получите IEnumerator для каждого перечисляемого, в то время как оба имеют другое значение, применяют селектор результатов по двум текущим значениям и yield.

+0

Спасибо, на самом деле я не думал перечислять! Я очень благодарен. – Sanci

 Смежные вопросы

  • Нет связанных вопросов^_^