IEnumerable实现仅适用于Dictionary值

时间:2016-11-12 16:09:33

标签: c# ienumerable enumeration

我有一个课程,比如Player,有一个名字和一些属性:

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

我想创建一个自定义集合类PlayerCollection,但是使用Dictionary而不是列表来更快地搜索。所以:

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

使用带有播放器名称的字典作为密钥将使我的程序的其余部分更容易。 现在我想实现IEnumerable<Player>,以便迭代播放器类,但我不能使用字典的枚举器,因为它是在KeyValuePair<string, Player>上实现的。

我该怎么做?

2 个答案:

答案 0 :(得分:3)

试试这个:

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

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

如果您正在寻找快速搜索的集合,我建议您阅读HashSet<T>这是该框架的一部分。

答案 1 :(得分:2)

KeyedCollection课程非常适合您的情况。它允许您通过集合成员的属性查找。您唯一需要做的就是创建一个派生类,该类具有该属性的选择器。

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

当您获得PlayersCollection的枚举器时,它将是IEnumerable<Players>