从哈希表中检索值的键c#

时间:2011-09-21 05:17:23

标签: c# hashtable

我有一个包含^ j值的哈希表。 j是键,^ j是值。 我现在正在计算另一个值a ^ m。我基本上想看看^ m是否在哈希表中。 我使用了ContainsValue fn。找到价值。我如何找到价值的关键?

以下是我想要实现搜索值的小片段。

    Dictionary<BigInteger, BigInteger> b = new Dictionary<BigInteger, BigInteger>();
     ***add a bunch of BigIntegers into b***
    for(int j=0; j < n; j++)
    {
       z =  q* BigInteger.ModPow(temp,j,mod);
       ***I want to implement to search for z in b here****
    }

这会改变什么吗?我在for循环中搜索的事实?

4 个答案:

答案 0 :(得分:1)

最快的方法可能是遍历哈希表的DictionaryEntry项以查找值,从而为您提供密钥。我不知道怎么做。

答案 1 :(得分:1)

首先,您绝对应该使用Dictionary<TKey, TValue>而不是Hashtable - 如果您在.NET 4中使用BigInteger,则没有理由不在任何地方使用通用集合 你可以。大多数情况下,您可能会发现它的使用方式没有区别 - 只需创建它:

Dictionary<BigInteger, BigInteger> map = 
    new Dictionary<BigInteger, BigInteger>();

开头。需要注意的一点是,如果地图中没有键,索引器将抛出异常 - 使用TryGetValue获取值(如果存在)和bool来表示是否存在确实存在。

至于按值查找密钥 - 从Dictionary无法有效地 。您可以使用LINQ搜索所有条目,这是最容易完成的:

var key = map.Where(pair => pair.Value == value)
             .Select(pair => pair.Key)
             .First();

但是这将迭代整个字典,直到找到匹配,因此它是一个O(n)操作。

如果您想有效地执行此操作,则应保留两个词典 - 一个从aa^j,一个从a^ja。添加条目时,可以双向添加。 Stack Overflow上的某个地方我有一些类的示例代码可以为你做这个,但我怀疑我能够轻松找到它。编辑:有一个处理多个映射here; “单一映射”版本在该答案之下。

无论如何,一旦你有两个字典,每个方向一个,这很容易 - 显然你只需要在第二个字典中查找a^m作为键来找到创建它的原始值。

请注意,您需要考虑两个原始密钥是否有可能以相同的值结束 - 此时您显然无法在一个反向中同时拥有两个映射字典(除非它是Dictionary<BigInteger, List<BigInteger>>或类似的东西)。

答案 2 :(得分:0)

private object GetKeyByValue(object searchValue)
{
    foreach (DictionaryEntry entry in myHashTable)
    {
        if (entry.Value.Equals(searchValue))
        {
            return entry.Key;
        }
    }

    return null;
}

答案 3 :(得分:0)

修改 已更改为使用Dictionary<TKey, TValue>

Dictionary<TKey, TValue>IEnumerable<KeyValuePair<TKey, TValue>>。如果直接对foreach进行class SomeType { public int SomeData = 5; public override string ToString() { return SomeData.ToString(); } } // ... var blah = new Dictionary<string, SomeType>(); blah.Add("test", new SomeType() { SomeData = 6 }); foreach (KeyValuePair<string, SomeType> item in blah) { if(e.Value.SomeData == 6) { Console.WriteLine("Key: {0}, Value: {1}", item.Key, item.Value); } } ,则可以获得每个条目的键和值。

using System;
using System.Collections;
using System.Linq;

class SomeType
{
    public int SomeData = 5;

    public override string ToString()
    {
        return SomeData.ToString();
    }
}

class Program
{
    static void Main(string[] args)
    {
        var blah = new Dictionary<string, SomeType>();
        blah.Add("test", new SomeType() { SomeData = 6 });

        // Build an enumeration of just matches:

        var entriesThatMatchValue = blah
            .Where(e => e.Value.SomeData == 6);

        foreach (KeyValuePair<string, SomeType> item in entriesThatMatchValue)
        {
            Console.WriteLine("Key: {0}, Value: {1}", item.Key, item.Value);
        }

        // or: ...

        // Build a sub-enumeration of just keys from matches:

        var keysThatMatchValue = entriesThatMatchValue.Select(e => e.Key);

        // Build a list of keys from matches in-line, using method chaining:

        List<string> matchingKeys = blah
            .Where(e => e.Value.SomeData == 6)
            .Select(e => e.Key)
            .ToList();
    }
}

如果您有更新版本的.Net框架,可以使用Linq查找匹配项,并将它们放在自己的集合中。这是一个显示Linq语法的代码示例:

{{1}}