Załóżmy, że mam dwa (lub więcej) IEnumerable<T>
z wieloma elementami. Co IEnumerable
ma inny typ T
. Listy mogą być ekstremalnie długie i nie powinny być całkowicie załadowane do pamięci.Jak mogę iterować na kilka IEnumerables jednocześnie?
IEnumerable<int> ints = getManyInts();
IEnumerable<string> strings = getSomeStrings();
IEnumerable<DateTime> dates = getSomeDates();
Co chcę zrobić jest iteracyjne nad tych list, a otrzymasz przedmiot zawierający jeden int, jeden łańcuch i jeden DateTime na każdym kroku, aż do końca najdłuższy i najkrótszy lista została osiągnięta. Oba przypadki powinny być wspierane (bool param najdłuższy vs najkrótszy). Dla każdego przedmiotu niedostępnego na krótszych listach (ponieważ koniec został już osiągnięty) oczekiwałbym wartości domyślnych.
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;
}
Czy można to zrobić z linq przy odroczonym wykonaniu? Znam rozwiązanie przy użyciu IEnumerators bezpośrednio w połączeniu z powrotem zwrotu. Zobacz How can I iterate over two IEnumerables simultaneously in .NET 2
Patrzysz na 'funkcji Zip' który akceptuje więcej niż dwa parametry. – Gabe
Co można łatwo zrobić za pomocą polecenia 'var result = s1.Zip (s2.Zip (s3, (a, b) => nowe {a, b}), (a, b) => nowe {a = a , b = ba, c = bb}); ' – Mormegil
Co jeśli s2 była najdłuższą listą, a s1 zawierało tylko kilka elementów? –