在C#中获取Collection / List / Dictionary的最后5项?

时间:2015-02-22 21:43:17

标签: c# dictionary

我有一个班级:

public class MatchItem
{
    public string round { get; set; }
    public string player1 { get; set; }
    public string player2 { get; set; }
    public string scores { get; set; }
}

最初我使用的是词典:

private Dictionary<string, MatchItem> results = new Dictionary<string, MatchItem>();

字典允许我使用散列字符串作为索引键来访问MatchItem值。

然而,现在我有了新的需求。我希望能够访问添加到字典中的最后X个项目。最好的方法是什么?

2 个答案:

答案 0 :(得分:2)

您可以使用X方法获取最后Skip项,但您应该记住Dictionary没有订单,因此这可能无法正常工作,但它会适用于有序集合,例如List<T>

var items = results.Skip(results.Count - 5).Select(x => x.Value);

答案 1 :(得分:0)

如果您必须将您的值保存在字典中,那么您将需要一个帮助集合来保持条目的顺序或输入的时间。在我的例子中,我将它打包在一个非常简单的包装类OrderedDictionary中,但这并不意味着你必须有一个包装类。您可以轻松添加帮助程序集合,以便将时间保留到您拥有字典的类中。

在字典中添加条目时,您必须更新帮助字典。在这里,我去了DateTime.Now.Ticks以保持条目的顺序。然后,当返回项目时,我按递减入口时间对集合进行排序,获取所需的密钥数量,在主字典中搜索这些密钥并返回结果。

public class OrderedDictionary<T, K>
{
    private Dictionary<T, K> baseDictionary;
    private Dictionary<long, T> entryTimeDictionary;

    public OrderedDictionary()
    {
        this.baseDictionary = new Dictionary<T, K>();
    }

    public void Add(T key, K val)
    {
        this.baseDictionary[key] = val;
        this.entryTimeDictionary[DateTime.Now.Ticks] = key;
    }

    public List<KeyValuePair<T, K>> GetLastEnteredItems(int numberOfEntries)
    {
        // Find n last keys.
        var lastEntries = 
            this.entryTimeDictionary
                .OrderByDescending(i => i.Key)
                .Take(numberOfEntries)
                .Select(i => i.Value);

        // Return KeyValuePair for itmes with last n keys
        return this.baseDictionary
                   .Where(i => lastEntries.Contains(i.Key))
                   .ToList();
    }
}

如前所述,您可以在班级中使用相同的机制。但是,如果你决定创建自己的包装类,它应该实现IDictionary,ICollection和IEnumerable接口。