我以这种方式在字典中有数据:
Dictionary<string, cls_CTCs> dict = new Dictionary<string, cls_CTCs>();
dict.Add("9814|30500994",Obj);
dict.Add("41377|30302099",Obj);
dict.Add("65793|30500337",Obj);
dict.Add("92894|30300795",Obj);
dict.Add("92894|30300826",Obj);
dict.Add("92894|30300827",Obj);
dict.Add("92894|30300828",Obj);
dict.Add("56936|30300894",Obj);
dict.Add("56936|30300365",Obj);
dict.Add("56936|30300485",Obj);
其中key是字符串类型,value是类的对象。我想在like或startswith pattern中找到该字典的所有键中第一次出现的字符串。例如,如果我搜索“92894”,那么它应该返回密钥“92894 | 30300795”,如果我搜索“56936”,那么它应该返回密钥“56936 | 30300894”。
我知道可以通过LINQ轻松完成,但我不想使用LINQ,因为我会在C#CLR存储过程中使用此代码,但不允许使用LINQ。那么,有什么扩展方法或任何其他方法可以实现我想要的目标吗?
答案 0 :(得分:3)
您可以使用Dictionary.Keys返回字典中的所有键。
然而,词典中键的顺序是未定义的,因此找到第一个词没有意义 - 它会随机返回任何匹配的键。
// Returns a key which starts with prefix, or null if not found.
public string FindKey<T>(Dictionary<string, T> dict, string prefix)
{
foreach (string key in dict.Keys)
{
if (key.StartsWith(prefix))
return key;
}
return null;
}
答案 1 :(得分:0)
不幸的是,如果没有对字典进行完整的迭代扫描,就没有其他方法可以实现它。
原因是Dictionary<TKey, TValue>
的当前实现如何在内部工作。所有密钥都使用其哈希码编制索引(请参阅Object.GetHashCode
方法)。因此,只能快速有效地搜索作为整个对象的密钥。
如果您需要通过部分匹配(StartsWith
或其他)找到某些键,则只需迭代执行比较/查找的每个键。
您既可以使用字典的Keys
集合,也可以使用KeyValuePair<TKey, TValue>
对象迭代字典本身。
但请记住,没有特定的顺序。所以“第一次出现”可能是一项难以实现的要求。
如果对象的顺序很重要,您可能需要使用OrderedDictionary
。