Применить селекторы на пары элементов возможно бесконечных последовательностей C#
Я должен реализовать метод расширения
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;
но это также нарушается, когда одна последовательность длиннее другой. Как я могу решить это?
1 ответ
.NET уже имеет реализацию этой точной функциональности, Enumerable.Zip
,
Что касается того, как реализовать это, если вы хотите сделать это самостоятельно, это довольно просто. Получить IEnumerator
для каждого перечислимого, в то время как оба имеют другое значение, примените селектор результата к двум текущим значениям и yield
этот результат.