C# 哈希表副本
我有一个哈希表,我正在同一行上转换为字典C# 哈希表副本,c#,linq,C#,Linq,我有一个哈希表,我正在同一行上转换为字典 Hashtable ids = new Hashtable(); ids = new Hashtable(_AppContext.TBL_PERSON.Where(oItem => oItem.DELETED == false).ToDictionary(o => o.CODE.ToUpper(), o => o.PERSON_ID)); 问题是我犯了个错误 “已添加具有相同密钥的项。” 在检查行之后,发现代码列多次具有相同的行值。
Hashtable ids = new Hashtable();
ids = new Hashtable(_AppContext.TBL_PERSON.Where(oItem => oItem.DELETED == false).ToDictionary(o => o.CODE.ToUpper(), o => o.PERSON_ID));
问题是我犯了个错误
“已添加具有相同密钥的项。”
在检查行之后,发现代码列多次具有相同的行值。
有没有一种方法可以只选择第一个值,就像first()一样,但不将其设为第一个datatable,然后将其更改为hashtable?当然-使用
GroupBy
,然后选择组中的first()
对象作为值:
ids = new Hashtable(
_AppContext.TBL_PERSON.Where(oItem => oItem.DELETED == false)
.GroupBy(o => o.CODE.ToUpper())
.ToDictionary(g => g.Key, g => g.First().PERSON_ID)
);
请记住,这将为您提供一个包含
KeyValuePair
对象的哈希表,这看起来很奇怪。如果您只需要字典,您仍然可以使用GroupBy
,只需删除外部的哈希表
创建。为什么需要哈希表
HashSet
或Dictionary
更可取。此外,您还可以将StringComparer.OrdinalIgnoreCase
作为IEqualityComporer
实例传递给ToDictionary
调用,以便默认情况下对字典的任何查找或添加都不区分大小写。这就省去了你对每一个新键都要做ToUpper或者查找的麻烦。谢谢,它可以工作,可能会有点奇怪,但是它会将哈希表返回到另一个我没有处理过的页面,所以更改它会导致其他很多事情的改变,但是这个解决方案非常有效