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