C# 比较循环中两个哈希表的值

C# 比较循环中两个哈希表的值,c#,hashtable,C#,Hashtable,我有两个哈希表。我想根据键比较两个哈希表的值。我希望在循环中执行此操作,如果找到匹配项,我希望执行字符串生成操作。但问题是我不知道有什么机制可以在循环中比较它们。请引导我。。。 下面是我要比较的哈希表 HashTable OldTable= new HashTable(); OldTable.Add("Date of Event", OCEFData.EventDate); OldTable.Add("Angina Status", OCE

我有两个哈希表。我想根据键比较两个哈希表的值。我希望在循环中执行此操作,如果找到匹配项,我希望执行字符串生成操作。但问题是我不知道有什么机制可以在循环中比较它们。请引导我。。。 下面是我要比较的哈希表

       HashTable OldTable= new HashTable();

        OldTable.Add("Date of Event", OCEFData.EventDate);
            OldTable.Add("Angina Status", OCEFData.AnginaStatusValue);
            OldTable.Add("Please indicate the body system involved (tick all that apply)",strBodySystem.ToString());
            OldTable.Add("If Unstable Angina, define Braunswald Classification", OCEFData.UnstableAnginaValue);
            OldTable.Add("If Stable Angina", OCEFData.StableAnginaValue);
            OldTable.Add("Details of method of Documentation of Angina", OCEFData.AnginaDocDetails);
            OldTable.Add("INFORM TO SPONSOR", (OCEFData.IsInformed)?"Yes":"No");
            OldTable.Add("DATE OF INFORMATION TO SPONSOR ", OCEFData.SponsorDate);
            OldTable.Add("DATE OF INFORMATION TO INSTITUTIONAL ETHICS COMMITTEE", OCEFData.EthicsCommitteeDate);
            OldTable.Add("DATE OF INFORMATION TO LICENSING AUTHORITY", OCEFData.LicensingAuthority);



       HashTable NewTable= new HashTable();

       NewTable.Add("Date of Event", OCEFData.EventDate);
        NewTable.Add("Angina Status", OCEFData.AnginaStatusValue);
        NewTable.Add("Please indicate the body system involved (tick all that apply)", strBodySystem.ToString());
        NewTable.Add("If Unstable Angina, define Braunswald Classification", OCEFData.UnstableAnginaValue);
        NewTable.Add("If Stable Angina", OCEFData.StableAnginaValue);
        NewTable.Add("Details of method of Documentation of Angina", OCEFData.AnginaDocDetails);
        NewTable.Add("INFORM TO SPONSOR", (OCEFData.IsInformed)?"Yes":"No");
        NewTable.Add("DATE OF INFORMATION TO SPONSOR ", OCEFData.SponsorDate);
        NewTable.Add("DATE OF INFORMATION TO INSTITUTIONAL ETHICS COMMITTEE", OCEFData.EthicsCommitteeDate);
        NewTable.Add("DATE OF INFORMATION TO LICENSING AUTHORITY", OCEFData.LicensingAuthority);

您可以使用Linq来相交键,从而获得两个表中的键集合

var combinedKeys=OldTable.Keys.Cast<string>().Intersect(NewTable.Keys.Cast<string>())
var combinedKeys=OldTable.Keys.Cast().Intersect(NewTable.Keys.Cast())
然后,您可以迭代键或使用Linq Select或Agregate语句来获得集合结果

编辑

由于哈希表不是强类型,
不会给您一个IEnumerable,因此调用
Cast()
来获取一个
IEnumerable


如果您使用的是强类型的
词典
,则不需要
Cast()
部分。

假设您正在尝试匹配两个哈希表中的键。。。你可以像我一样

 foreach (string key in oldtable.Keys)
    {
        if (newtable.Contains(key))
        {
            // do your work;
        }
        else
        {
            // do your work;         
       }
    }

这是你想要的方式吗

Hashtable OldTable = new Hashtable();
Hashtable NewTable = new Hashtable();

        foreach (DictionaryEntry entry in OldTable)
        {
            if(NewTable.ContainsKey(entry.Key))
            {
                //Do something?
            }
        }

第一件事-使用类型化的
字典
而不是
哈希表
,下面是值为
字符串
类型的示例,这将很容易将
字符串
更改为自定义类型(我相信
枚举
或已经是字符串常量)


你试过什么?你有什么困难?请发布您迄今为止编写的代码,并解释您遇到的问题。我开始时感到困惑。我试过foreach循环,在一次迭代中操作这两个表是行不通的。。。这里有很多例子。我不明白你想做什么。“基于键比较值”是什么意思?那么你怎么处理匹配值呢?看起来这是对哈希表的滥用,一切都应该以另一种方式——你应该通过一个键找到一个值,而不是通过一个值。我正在尝试比较值。请看问题。如果值是相同的,那么我想得到键。意味着我只需要哈希表中那些值相同的键…是的…这就是我想要的…谢谢你…:)intersect解决方案不是最优的,因为你已经有一个字典,intersect需要将所有键放入一个内部集合。HashTable.keys属性在System.Collections命名空间中具有ICollection类型。这没有Intersect扩展方法(这是IEnumerable的扩展)。@DanKodi您是对的,因为哈希表没有强类型键,比如
字典
。调用
集合上的
Cast()
可以解决这个问题。
IDictionary<string, string> map1 = new Dictionary<string, string>
                                        {
                                            {"A", "M1-A"},
                                            {"B", "M1-B"},
                                            {"C", "M1-C"}
                                        };

IDictionary<string, string> map2 = new Dictionary<string, string>
                                        {
                                            {"A", "M2-A"},
                                            {"B", "M2-B"},
                                            {"D", "M2-D"}
                                        };
var items = map1.Keys.Intersect(map2.Keys)
                     .Select(k => map1[k] + " / " + map2[k])
                     .ToList();
IList<string> results = new List<string>();
foreach (var key in map1.Keys)
{
    if (map2.ContainsKey(key))
    {
        results.Add(map1[key] + " / " + map2[key]);
    }
}

OUTPUT:
M1-A / M2-A
M1-B / M2-B