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

C# 从哈希表c中检索值的键#,c#,hashtable,C#,Hashtable,我有一个包含^j值的哈希表。j是键,a^j是值。 我现在正在计算另一个值a^m。我基本上想看看a^m是否在哈希表中。 我使用了ContainsValue fn。找到价值。我该如何找到值的键 下面是我想在哪里实现对值的搜索的一个小片段 Dictionary<BigInteger, BigInteger> b = new Dictionary<BigInteger, BigInteger>(); ***add a bunch of BigIntegers i

我有一个包含^j值的哈希表。j是键,a^j是值。 我现在正在计算另一个值a^m。我基本上想看看a^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****
    }
Dictionary b=newdictionary();
***把一堆大整数加到b中***
对于(int j=0;j

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

最快的方法可能是遍历哈希表的
字典entry
项来查找值,从而获得键。我不知道怎么做。

首先,你绝对应该使用
字典而不是
哈希表
——如果你使用的是.NET 4中的
大整数
,没有理由不在任何地方使用泛型集合。在大多数情况下,您可能会发现它的使用方式没有什么不同-只需使用以下工具创建它:

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

    return null;
}
Dictionary<BigInteger, BigInteger> map = 
    new Dictionary<BigInteger, BigInteger>();
但这将遍历整个字典,直到找到匹配项,因此这是一个O(n)操作

如果您想有效地执行此操作,您应该保留两个词典-一个从
a
a^j
,另一个从
a^j
a
。当您添加条目时,请将其前后添加。在堆栈溢出的某个地方,我有一个类的示例代码,可以为您实现这一点,但我怀疑我是否能够轻松找到它。编辑:有一个可以处理多个映射;“单一映射”版本在该版本下面的答案中

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

注意,你需要考虑两个原密钥是否可能以相同的值结束——在这一点上,显然你不能在一个反向字典中同时拥有这两个映射(除非它是<代码>字典/代码>或类似的东西)。< > P> <强>编辑:< /强>改为使用<代码>字典< /代码>

Dictionary
是一个
IEnumerable
。如果直接对每个条目执行
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);
    }
}
类SomeType
{
公共数据=5;
公共重写字符串ToString()
{
返回SomeData.ToString();
}
}
// ...
var blah=新字典();
Add(“test”,newsometype(){SomeData=6});
foreach(blah中的KeyValuePair项)
{
if(e.Value.SomeData==6)
{
WriteLine(“键:{0},值:{1}”,item.Key,item.Value);
}
}
如果您有较新版本的.Net framework,则可以使用Linq查找匹配项,并将它们放在它们自己的集合中。下面是一个代码示例,展示了一点Linq语法:

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();
    }
}
使用系统;
使用系统集合;
使用System.Linq;
类SomeType
{
公共数据=5;
公共重写字符串ToString()
{
返回SomeData.ToString();
}
}
班级计划
{
静态void Main(字符串[]参数)
{
var blah=新字典();
Add(“test”,newsometype(){SomeData=6});
//生成仅匹配项的枚举:
var entriesThatMatchValue=blah
其中(e=>e.Value.SomeData==6);
foreach(entriesThatMatchValue中的KeyValuePair项)
{
WriteLine(“键:{0},值:{1}”,item.Key,item.Value);
}
//或:。。。
//根据匹配项生成仅关键帧的子枚举:
var keystatmatchvalue=entriesThatMatchValue.Select(e=>e.Key);
//使用方法链接,从内联匹配项生成密钥列表:
列表匹配键=废话
.其中(e=>e.Value.SomeData==6)
.选择(e=>e.Key)
.ToList();
}
}

Y你不用
Dictionary
?我不知道如何使用Dictionary,我已经知道如何使用哈希表,至少在大多数情况下是这样。把我的大整数哈希表转换成字典容易吗?如果你的键是指数,为什么不检查一下键
m
?请看:@NullUser我已经创建了一个包含所有值(j,a^j)的哈希表。然后我使用for循环来计算数字z=r*biginger.ModPow(a,j,mod)。在for循环中,值a^m正是我为问题输入的值。在程序中,它是q=j*BigInteger.ModPow(a(逆),j,mod),for循环从0开始。我想你之前的答案是:@Nook:这真的不相关-基本上你有键,它们映射到值。如果您想要一种有效的方法,则需要构建另一个映射。如果你不在乎这个查找是O(n),你可以迭代代替。我从哈希表改为字典,就像…几乎每个人建议的那样。那么现在我会改变在字典b中搜索值v的方式吗?找到了v的钥匙吗?@Nook:你仍然可以使用这个答案中的答案,你只需要去掉这些石膏
Dictionary
是一个
IEnumerable
,而
Hashtable
是一个普通的
IEnumerable
(它返回
对象
类型
DictionaryEntry
的实例)。我将编辑答案以反映此更改…谢谢!但我也在想,既然我已经在运行for循环,那么对我来说什么是最好的方法呢o@Nook:除了对原始表执行
O(N)
操作外,无法对其进行转换。关联数组/哈希表/字典不是为解决这个问题而设计的。。。你可以在第二天同时建造
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();
    }
}