Предположим, у меня есть два (или более) IEnumerable<T>
со многими элементами. Каждый IEnumerable
имеет другой тип T
. Списки могут быть чрезвычайно длинными и не должны быть полностью загружены в память.Как я могу перебирать несколько IEnumerables одновременно
IEnumerable<int> ints = getManyInts();
IEnumerable<string> strings = getSomeStrings();
IEnumerable<DateTime> dates = getSomeDates();
То, что я хочу сделать, это перебрать эти списки, и получить элемент, содержащий один INT, одну строку и один DateTime для каждого шага, до конца самого длинного или самый короткий список был достигнут. Оба случая должны поддерживаться (bool param самый длинный или самый короткий или около того). Для каждого элемента, недоступного в более коротких списках (поскольку конец уже достигнут), я бы ожидал значения по умолчанию.
for(Tuple<int,string,DateTime> item in
Foo.Combine<int,string,DateTime>(ints, strings, dates))
{
int i=item.Item1;
string s=item.Item2;
DateTime d=item.Item3;
}
Можно ли это сделать с помощью linq с использованием отложенного исполнения? Я знаю решение, использующее IEnumerators, в сочетании с возвратом доходности. См How can I iterate over two IEnumerables simultaneously in .NET 2
Вы ищете 'функцию Zip', которая принимает более двух параметров. – Gabe
Что вы можете легко сделать, используя что-то вроде 'var result = s1.Zip (s2.Zip (s3, (a, b) => new {a, b}), (a, b) => new {a = a , b = ba, c = bb}); ' – Mormegil
Что делать, если s2 был самым длинным списком, а s1 состоял из нескольких элементов? –