2013-05-13 56 views
0

我谷歌为这好了二十分钟左右。请原谅我,如果这是重复的。当我必须使用namevaluecollection进行评估时,如何才能找到密钥?

所以我从app.config文件阅读,并有一串钥匙/值对

{'a','1'},{'b','5'},{'c','9'} ... etc 

寻找值时,给钥匙很容易。但是反过来证明比我想象的要困难得多。

奇怪的是,msdn上的api似乎没有提及任何有关反向搜索的内容。
如果你只有被允许“1”,你会如何找到钥匙的价值?

+0

如果这些值都是不同的(否则你的问题没有意义),为什么不把它们复制到一个全局散列表中,其值作为键和键作为值? – 2013-05-13 23:45:04

+0

是的,这些价值都是不同的,但我希望有一个更优雅的解决方案。 – Wusiji 2013-05-13 23:46:51

回答

4

我能想到这样做是使用Linq的AllKeys财产的最好方式:

myNameValueCollection.AllKeys.First(key => myNameValueCollection[key] == myValue); 

NameValueCollection没有实现IEnumerable<KeyValuePair<string, string>>这是不幸的。

我从你的评论中看到你对Linq不是很熟悉。我在评论中提供了一些链接来帮助你。这种特殊的Linq查询大约相当于以下,写得很简洁:

foreach(var key in myNameValueCollection.AllKeys) 
{ 
    var value = myNameValueCollection.AllKeys[key]; 
    if (value == myValue) 
    { 
     return value; 
    } 
} 
+0

你能解释一下[key => myNameValueCollection [key] == myValue]在做什么?或者将我链接到一个可以更好地解释其工作原理的在线资源? – Wusiji 2013-05-14 00:02:26

+0

这是使用lambda表达式语法 - C#中的常见做法。 Linq库使得它特别好用。 'First'运算符在'myNameValueCollection.AllKeys'中寻找第一个'key',匿名函数参数的计算结果为'true'。所以在这里,我们正在寻找第一个'key',这样如果我们查看'myValueCollection'中的对应值,它就等于所需的值。在此处阅读有关Linq的更多信息:http://msdn.microsoft.com/en-us/library/vstudio/bb397926.aspx和lambda表达式:http://msdn.microsoft.com/en-us/library/bb397687。 ASPX – 2013-05-14 00:07:38

1

当然,这是一个单行道,因为散列函数应用于关键,而不是价值。然而,如果你的价值观是独特的(记住它们不一定是),那么就有明显的解决办法。 Eugen在评论中的建议可能是最好的,如果你要反复对价值观进行研究。如果您正在寻找更多的一次性解决方案,您只需循环检查值就可以检查匹配。当值匹配时,您知道它与哪个关键字相关联。

相关问题