我有一个班级:
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个项目。最好的方法是什么?
答案 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接口。