Furkan Gözükara
Furkan Gözükara

Reputation: 23830

How do I make a class iterable?

This is my class

public class csWordSimilarity
{
    public int irColumn1 = 0;
    public int irColumn2 = 0;
    public int irColumn3 = 0;
    public int irColumn4 = 0;
    public int irColumn5 = 0;
}

I want to make that class iterable to be used like the way below

foreach (int irVal in myVarWordSimilarity)
{

} 

myVarWordSimilarity is csWordSimilarity type. So I want to iterate all public int variables. How do I need to modify csWordSimilarity class for making it iterable like the way above.

Upvotes: 30

Views: 30557

Answers (2)

Joshua Honig
Joshua Honig

Reputation: 13215

Implement IEnumerable. See Using Iterators (C# Programming Guide)

In your case you could just use the built-in iterator of a List like so:

using System;
using System.Collections.Generic;

class csWordSimilarity : IEnumerable<int> {
    public int irColumn1 = 0;
    public int irColumn2 = 0;
    public int irColumn3 = 0;
    public int irColumn4 = 0;
    public int irColumn5 = 0;

    public IEnumerator<int> GetEnumerator() {
        return (new List<int>() { 
            irColumn1, irColumn2, irColumn3, irColumn4, irColumn5 
        }).GetEnumerator();
    }
    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() {
        return GetEnumerator();
    }
}

Upvotes: 7

edvaldig
edvaldig

Reputation: 2299

You can implement IEnumerable and have the GetEnumerator override return an "iterator" over the variables using the yield statement

class csWordSimilarity : IEnumerable<int>
{
    private int _var1 = 1;
    private int _var2 = 1;
    private int _var3 = 1;
    private int _var4 = 1;

    public IEnumerator<int> GetEnumerator()
    {
        yield return _var1;
        yield return _var2;
        yield return _var3;
        yield return _var4;
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

Upvotes: 39

Related Questions