Вы можете выполнить эту работу, используя метод расширения LINQ .Zip()
:
IEnumerable<string> source = new List<string> { "First", "1", "Second", "2" };
var tupleList = source.Zip(source.Skip(1),
(a, b) => new Tuple<string, string>(a, b))
.Where((x, i) => i % 2 == 0)
.ToList();
В основном подход заключается в том, чтобы сжать источник Enumerable с самим собой, пропуская первый элемент, так что второе перечисление одно, что даст вам пары ("First", "1"), ("1", "Second" ), («Второй», «2»).
Затем мы фильтруем нечетные кортежи, поскольку они нам не нужны, и получаем правильные пары кортежей («Первый», «1»), («Второй», «2») и т. Д.
Edit:
Я действительно согласен с мнением комментариев - это то, что я бы назвал «умным» кодом - выглядит умным, но имеет очевидные (и не столь очевидные) недостатки:
Производительность : перечисляемый должен
пройти дважды - для одного и того же
причина, по которой его нельзя использовать на
Enumerables
которые потребляют их
источник, то есть данные из сети
потоки.
Техническое обслуживание : Не очевидно, что
код делает - если кто-то еще
поручено поддерживать там код
могут быть проблемы впереди, особенно
данный пункт 1.
Сказав это, я, вероятно, сам использовал бы старый добрый цикл foreach
, если бы у меня был выбор, или со списком в качестве исходного набора цикла for
, чтобы я мог напрямую использовать индекс.