Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WinForms, .Net Framework Новый топик    Ответить
 Ленивая склейка двух IEnumerable<string> попарно  [new]
WinterGraveyard
Member

Откуда:
Сообщений: 77
Такая задача: есть 2 IEnumerable<string>, их нужно склеить попарно, получив на выходе IEnumerable<string> с скленными строками.
Т.е., например, первая последовательность: "A", "B", "C", вторая "1", "2", "3", на выходе нужно получить последовательность "A1", "B2", "C3". При этом если в исходных последовательностях содержится разное количество элементов, должна выбрасываться ошибка. Если перегнать исходные последовательности в List<string>, то всё элементарно, но хочется такую операцию провернуть ленивым образом, и я никак не могу сообразить, как это реализовать.
19 мар 21, 08:51    [22297099]     Ответить | Цитировать Сообщить модератору
 Re: Ленивая склейка двух IEnumerable<string> попарно  [new]
fkthat
Member

Откуда:
Сообщений: 4642
var seq1 = new[] {"A", "B", "C"};
var seq2 = new[] {"1", "2", "3"};
var result = seq1.Zip(seq2, (x, y) => $"{x}{y}");

А, ну, правда, Zip не бросит exception если разное кол-во элементов.

Сообщение было отредактировано: 19 мар 21, 09:23
19 мар 21, 09:26    [22297104]     Ответить | Цитировать Сообщить модератору
 Re: Ленивая склейка двух IEnumerable<string> попарно  [new]
fkthat
Member

Откуда:
Сообщений: 4642
Если надо точное соответствие, то, например как-то так:
public static IEnumerable<R> ZipExact<T1, T2>(this IEnumerable<T1> source1, IEnumerable<T2> source2, Func<T1, T2, R> selector) 
{
    using var e1 = source1.GeEnumerator();
    using var e2 = source2.GetEnumerator();

    while(true)
    {
        var n1 = e1.MoveNext();
        var n2 = e2.MoveNext();

        if(n1 && n2)
        {
            yield return selector(e1.Current, e2.Current);
        }
        else if(!n1 && !n2)
       {
            break;
       }
       else
       { 
           throw new InvalidOpertaionException("Different sequence lengths");
       }
    } 
}
19 мар 21, 09:41    [22297111]     Ответить | Цитировать Сообщить модератору
 Re: Ленивая склейка двух IEnumerable<string> попарно  [new]
WinterGraveyard
Member

Откуда:
Сообщений: 77
Спасибо, то, что нужно.
19 мар 21, 10:54    [22297160]     Ответить | Цитировать Сообщить модератору
Все форумы / WinForms, .Net Framework Ответить