Применить селекторы на пары элементов возможно бесконечных последовательностей 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 этот результат.

Другие вопросы по тегам