2016-11-12 5 views
0

У меня есть класс, скажем Player, с именем и некоторыми атрибутами:IEnumerable реализация только для словаря значений

public class Players 
{ 
    public string PlayerName { get; set; } 
    public IList<Goal> Goals { get; set; } 
    ... 
} 

Я хочу, чтобы создать пользовательский класс коллекции, PlayerCollection, но с использованием словаря вместо список для более быстрого поиска. Таким образом:

public class PlayersCollection 
{ 
    private readonly IDIctionary<string, Player> _players; 
    .... 

Использование словаря с именем игрока в качестве ключа облегчит работу в остальной части моей программы. Теперь я хотел бы реализовать IEnumerable<Player>, чтобы перебирать класс игрока, но я не могу использовать перечислитель словаря, потому что он реализован на KeyValuePair<string, Player>.

Как я могу это сделать?

+0

'.select (х => x.Value)' –

+2

просто возвращает '_players.Values.GetEnumerator()' ' –

+0

Dictionary' реализует же' IEnumerable' в виде списка, так что каждый элемент является элементом является KeyValuePair, и здесь Ключ будет именем и значением будет объект –

ответ

2

Класс KeyedCollection идеален для вашей ситуации. Это позволяет вам искать свойство членов коллекции. Единственное, что вам нужно сделать, это создать производный класс, который имеет селектор для свойства.

public class PlayersCollection : KeyedCollection<string, Players> 
{ 
    protected override string GetKeyForItem(Players item) 
    { 
     return item.PlayerName; 
    } 
} 

Когда вы получаете нумератор для PlayersCollection это будет IEnumerable<Players>.

+0

Это идеально подходит, спасибо – Phate01

2

Попробуйте это:

public class PlayersCollection : IEnumerable<Player> 
{ 
    private readonly IDictionary<string, Player> _players; 

    public IEnumerator<Player> GetEnumerator() 
    { 
     return _players.Select(player => player.Value).GetEnumerator(); 
    } 
} 

Если вы ищете коллекцию с быстрым поиском Я предлагаю вам прочитать о HashSet<T>, который является частью системы.

+0

Это будет работать для предлагаемого варианта использования –

+0

Фактически вы должны иметь возможность use .Values ​​вместо выбора значений. Эффективность будет улучшена – Phate01

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

  • Нет связанных вопросов^_^