Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 哈希表副本_C#_Linq - Fatal编程技术网

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或者查找的麻烦。谢谢,它可以工作,可能会有点奇怪,但是它会将哈希表返回到另一个我没有处理过的页面,所以更改它会导致其他很多事情的改变,但是这个解决方案非常有效