Are multiple iterators (for a single class or object) possible in C# .NET? If they are, give me some simple examples.
Sorry if the question is not understandable and please make me clear.
Are multiple iterators (for a single class or object) possible in C# .NET? If they are, give me some simple examples.
Sorry if the question is not understandable and please make me clear.
You could certainly create different iterators to traverse in different ways. For example, you could have:
public class Tree<T>
{
public IEnumerable<T> IterateDepthFirst()
{
// Iterate, using yield return
...
}
public IEnumerable<T> IterateBreadthFirst()
{
// Iterate, using yield return
...
}
}
Is that the kind of thing you were asking?
You could also potentially write:
public class Foo : IEnumerable<int>, IEnumerable<string>
but that would cause a lot of confusion, and the foreach
loop would pick whichever one had the non-explicitly-implemented GetEnumerator
call.
You can also iterate multiple times over the same collection at the same time:
foreach (Person person1 in party)
{
foreach (Person person2 in party)
{
if (person1 != person2)
{
person1.SayHello(person2);
}
}
}
It s not really clear if you mean that you can implement more than one iterator for a class, or if you can use more than one iterater for a class at a time. Either is possible.
You can have as many iterators as you like for a class:
public class OddEvenList<T> : List<T> {
public IEnumerable<T> GetOddEnumerator() {
return this.Where((x, i) => i % 2 == 0);
}
public IEnumerable<T> GetEvenEnumerator() {
return this.Where((x, i) => i % 2 == 1);
}
}
You can have as many instances of an iterator for a class active at the same time as you like:
foreach (int x in list) {
foreach (int y in list) {
foreach (int z in list) {
...
}
}
}
One option would be to implement the Strategy pattern:
IEnumerator
classes for each traversal strategy.SetStrategy()
method that changes that private attribute to the selected concrete strategy.GetEnumerator()
to return an instance of the current strategy.Of course, this means two threads trying to set the strategy at the same time could interfere, so if sharing the collection between threads is important, this isn t the best solution.
A straight Iterator pattern would also work, which is what I believe Jon Skeet is suggesting in his first example, but you lose the syntactic sugar of being able to use foreach
.
What is the use of default keyword in C#? Is it introduced in C# 3.0 ?
I m the only developer in my company, and am getting along well as an autodidact, but I know I m missing out on the education one gets from working with and having code reviewed by more senior devs. ...
I m pretty new to the Objective-C world and I have a long history with .net/C# so naturally I m inclined to use my C# wits. Now here s the question: I feel really inclined to create some type of ...
I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...
I have two EF entities. One has a property called HouseNumber. The other has two properties, one called StartHouseNumber and one called EndHouseNumber. I want to create a many to many association ...
How to user GhostScript DLL to convert PDF to PDF/A. I know I kind of have to call the exported function of gsdll32.dll whose name is gsapi_init_with_args, but how do i pass the right arguments? BTW, ...
Since I cannot order my dictionary, what is the best way of going about taking key value pairs and also maintaing an index?
Maybe it s something I m doing wrong. I m just learning Linq because I m bored. And so far so good. I made a little program and it basically just outputs all matches (foreach) into a label control. ...