Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using IEnumerable without foreach loop

I've gotta be missing something simple here.

Take the following code:

public IEnumerable<int> getInt(){   for(int i = 0; i < 10; i++){    yield return i;   } } 

I can call this with:

foreach (int j in obj.getInt()){   //do something with j } 

How can I use the getInt method without the foreach loop:

IEnumerable<int> iter = obj.getInt(); // do something with iter ?? 

Thanks.

EDITS

For those wondering why I'd want this. I'm iterating two things:

IEnumerator<int> iter = obj.getInt().GetEnumerator(); foreach(object x in xs){   if (x.someCondition) continue;   iter.MoveNext();   int n = iter.current();   x.someProp = n;   etc... } 
like image 323
Mark Avatar asked Feb 12 '10 01:02

Mark


2 Answers

You can get a reference to the Enumerator, using the GetEnumerator method, then you can use the MoveNext() method to move on, and use the Current property to access your elements:

var enumerator = getInt().GetEnumerator(); while(enumerator.MoveNext()) {     int n = enumerator.Current;     Console.WriteLine(n); } 
like image 126
Christian C. Salvadó Avatar answered Sep 20 '22 11:09

Christian C. Salvadó


My advice: don't mess around with the enumerators at all. Characterize your problem as a series of operations on sequences. Write code to express those operations. Let the sequence operators take care of managing the enumerators.

So let's see if I've got this straight. You have two sequences. Let's say { 2, 3, 5, 7, 12 } and { "frog", "toad" }. The logical operation you want to perform is, say "go through the first sequence. Every time you find a number divisible by three, get the next item in the second sequence. Do something with the resulting (number, amphibian) pair."

Easily done. First, filter the first sequence:

var filtered = firstSequence.Where(x=>x%3 == 0); 

Next, zip the filtered sequence with the second sequence:

var zipped = filtered.Zip(              secondSequence,               (y, z)=> new {Number = x, Amphibian = y}); 

And now you can iterate over the zipped sequence and do whatever you want with the pairs:

foreach(var pair in zipped)     Console.WriteLine("{0} : {1}", pair.Number, pair.Amphibian); 

Easy peasy, no messing about with enumerators.

like image 23
Eric Lippert Avatar answered Sep 17 '22 11:09

Eric Lippert