如何检查字典是否包含从预定义键开始的值?例如,我想仅在 特定键后搜索词典,而不是从第一个词开始搜索。
我该如何做到这一点?
答案 0 :(得分:2)
也许您需要的是OrderedDictionary
,它可以控制广告订单。这是一个示例,还包含一些搜索速度统计信息。
using System;
using System.Collections;
using System.Collections.Specialized;
using System.Diagnostics;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
var startIndex = 1000000; // 00:00:00.0004876
//var startIndex = 1; // 00:00:00.0152319
var searchedKey = "1";
OrderedDictionary orderedDictionary = new OrderedDictionary();
//populate
for (int i = 2; i < 1000002; i++)
{
orderedDictionary.Add(i.ToString(), "X");
}
orderedDictionary.Add("1", "A");
//copy the keys
String[] keys = new String[1000006];
orderedDictionary.Keys.CopyTo(keys, 0);
//measure the time with a System.Diagnostics.StopWatch
Stopwatch watch = new Stopwatch();
watch.Start();
for (int i = startIndex; i < orderedDictionary.Count; i++)
{
if (keys[i] == searchedKey)
{
Console.WriteLine(orderedDictionary[i]);
break;
}
}
watch.Stop();
Console.WriteLine(watch.Elapsed);
}
}
}
答案 1 :(得分:1)
不确定字典是否适合您在这种情况下使用,因为(如前所述)订单无法保证。但是,如果您使用List<>
,则可以获得所需的行为。像这个例子:
var items = new List<KeyValuePair<string, string>>();
items.Add(new KeyValuePair<string, string>("A", "1"));
items.Add(new KeyValuePair<string, string>("B", "2"));
items.Add(new KeyValuePair<string, string>("C", "3"));
var results = items.Skip(1).Take(1).ToList();
MessageBox.Show(results[0].Key + " " + results[0].Value);
在此示例中,使用Skip
和Take
方法显示的结果消息为“B 2”。它“跳过”第一个“1”并“取”下一个“1”;
编辑(重构使用KeyValuePair列表而不是字符串。)
答案 2 :(得分:1)
如果它是常规的Dictionary<TKey, TValue>
那么你就不能,除非你先对它进行排序。
您可以做的是使用SortedList<TKey, TValue>
或SortedDictionary<TKey, TValue>
,两者都按键排序。