仅用于字典值的 IEnumerable 实现

IEnumerable implementation only for Dictionary values

我有一个 class,比方说 Player,有一个名字和一些属性:

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

我想创建一个自定义集合 class,PlayerCollection,但使用字典而不是列表来进行更快的搜索。所以:

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

使用以玩家姓名为键的字典将使我的程序的其余部分变得更容易。 现在我想实现 IEnumerable<Player>,以便遍历播放器 class,但我不能使用字典的枚举器,因为它是在 KeyValuePair<string, Player>.[=16 上实现的=]

我该怎么做?

试试这个:

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

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

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

KeyedCollection class 非常适合您的情况。它使您可以按 属性 个集合成员进行查找。您唯一需要做的就是创建一个派生的 class,它具有 属性.

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

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