2012-02-26 3 views
13

Это мой классКак сделать класс итерабельным?

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

Я хочу, чтобы этот класс итератора, который будет использоваться как способ ниже

foreach (int irVal in myVarWordSimilarity) 
{ 

} 

myVarWordSimilarity является csWordSimilarity типа. Поэтому я хочу перебрать все общедоступные переменные int. Как мне изменить класс csWordSimilarity, чтобы сделать его итерируемым, как показано выше.

+1

Есть ли причина, по которой вы не использовали бы «Список '? Если да, то посмотрите на реализацию IEnumerable. –

+0

Пожалуйста, не добавляйте «C#» и т. Д. В свои заголовки. Для этого нужны теги. –

+0

Ссылка: [Как использовать цикл foreach с пользовательскими объектами] (http://stackoverflow.com/a/348977/1004522). Пройдите это, и это также поможет вам понять использование, когда захотите. –

ответ

21

Вы можете реализовать IEnumerable и иметь GetEnumerator переопределение возвращает «итератор» по переменным, используя yield

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(); 
    } 
} 
+0

большое спасибо за ответ, хотя ваше решение дает ошибку «Использование родового типа» System.Collections.Generic.IEnumerator 'требует 1 аргумент типа " – MonsterMMORPG

+1

Какую версию .NET вы используете? Я не могу придумать способ репликации этой ошибки, так как .NET 4 позволяет пропустить определение типа шаблона, чтобы он стал IEnumerable edvaldig

8

Внедрение IEnumerable. См Using Iterators (C# Programming Guide)

В вашем случае вы можете просто использовать встроенный в итератор в List так:

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(); 
    } 
} 
+0

Существует значительный накладной ресурс при создании экземпляра нового экземпляра с единственной целью вернуть его счетчик, оператор yield упрощает это и является более оптимальным. – edvaldig

+0

@edvaldig Я думаю, что это вопрос предпочтения. Если вы собираетесь называть это миллионы раз, тогда да используйте прямую 'yield'. В противном случае я предпочитаю использовать классы BCL и особенно «Список», где это удобно. –

+0

да, я собираюсь использовать его миллионы раз :) Спасибо за головы edvaldig – MonsterMMORPG

Смежные вопросы