我在List中有一些对象,比方说List<MyClass>,MyClass有几个属性.我想基于MyClass的3个属性创建列表的索引.在这种情况下,2个属性是int,而一个属性是datetime.
基本上我希望能够做到这样的事情:
Dictionary< CompositeKey , MyClass > MyClassListIndex = Dictionary< CompositeKey , MyClass >();
//Populate dictionary with items from the List<MyClass> MyClassList
MyClass aMyClass = Dicitonary[(keyTripletHere)];
Run Code Online (Sandbox Code Playgroud)
我有时会在列表上创建多个字典来索引它所拥有的类的不同属性.我不知道如何最好地处理复合键.我考虑过对三个值进行校验和,但这会产生碰撞的风险.
我基本上是在寻找一种方法来使用c#中的二维类型键来访问哈希表值.
最终我可以做这样的事情
HashTable[1][false] = 5;
int a = HashTable[1][false];
//a = 5
Run Code Online (Sandbox Code Playgroud)
这就是我一直在尝试的......没有用
Hashtable test = new Hashtable();
test.Add(new Dictionary<int, bool>() { { 1, true } }, 555);
Dictionary<int, bool> temp = new Dictionary<int, bool>() {{1, true}};
string testz = test[temp].ToString();
Run Code Online (Sandbox Code Playgroud) 从 ValueType.cs
**Action: Our algorithm for returning the hashcode is a little bit complex. We look ** for the first non-static field and get it's hashcode. If the type has no ** non-static fields, we return the hashcode of the type. We can't take the ** hashcode of a static member because if that member is of the same type as ** the original type, we'll end up in an infinite loop.
今天当我使用KeyValuePair作为字典中的键(它存储了xml属性名称(枚举)和它的值(字符串))时,我被它咬了,并期望它根据其所有字段计算它的哈希码,但根据实施情况,它只考虑了关键部分.
示例(来自Linqpad的c/p):
void Main()
{
var kvp1 = …Run Code Online (Sandbox Code Playgroud) 我搜索正确组合成分哈希码的帮助器GetHashCode()似乎带来了一些敌意.我从评论中得到的印象是,一些C#开发人员认为你不应该GetHashCode()经常覆盖- 当然一些评论者似乎认为帮助正确行为的图书馆将毫无用处.这种功能在Java中被认为是有用的,Java 社区要求将它添加到JDK中,现在它已经在JDK 7中了.
是否有一些基本原因在C#中你不需要 - 或者绝对不应 - 像Java一样频繁地覆盖GetHashCode()(并相应地Equals())?我发现自己经常使用Java来做这件事,例如,每当我创建一个我知道要保留的类型HashSet或者用作HashMap(等同于.net Dictionary)中的键时.
在我正在编写的应用程序中,我有两个可能很大的数据集,我需要相互映射.一个是从Web服务返回的List,一个是DataTable.我需要为列表中的每个项目取ANSI(或ISO)编号,并找到包含该ANSI编号的DataTable行,然后对其进行处理.
由于DataTable.Select非常慢,而且我必须为List中的每个项目执行此操作,因此我尝试了更快的替代方案.请记住,DataTable对象没有数据库.所以我不能利用任何SQL功能或类似的东西.
我认为最快的方法可能是使用KeyValuePair(A:Ansi编号或I:Iso编号)创建一个字典并将其用作密钥.该值将是行的其余部分.创建该字典显然需要一点处理时间,但随后我可以利用字典的极快搜索时间来查找我需要的每一行,然后将这些行添加回表中.因此,在列表的foreach循环中,我只会使用字典而不是O(n)或DataTable.Select所具有的O(1)的复杂性.
令我惊讶的是,字典非常慢.直到我发现使用字符串(只是ANSI编号)而不是KeyValuePair才能明显地提高性能.我的谈话速度提高了数百倍.这有可能在地球上如何?这是我测试的方式:
我生成一个模拟Web服务输出的List.我使用键(字符串或KeyValuePair)和DataRow作为值创建基于该列表的字典.我浏览该列表的foreach循环,并在我的字典中搜索该列表中的每个项目,然后为返回的DataRow分配一个值.而已.
如果我使用KeyValuePair作为访问字典的密钥,则需要几秒钟来处理1,000个项目,如果我修改字典只将字符串作为密钥,则10,000个项目需要几毫秒.仅供参考:我设计了测试以便始终存在命中,因此始终可以找到所有键.
这是我正在测量时间的代码块:
foreach(ProductList.Products item in pList.Output.Products)
{
//KeyValuePair<string, string> kv = new KeyValuePair<string, string>("A", item.Ansi);
DataRow row = dict[item.Ansi];
for (int i = 0; i < 10; i++)
{
row["Material"] = item.Material + "a"; //Do stuff just for debugging
}
hits++;
}
Run Code Online (Sandbox Code Playgroud)
那么,如果我使用Dictionary(KeyValuePair,DataRow)而不是Dictionary(String,DataRow),那么地球上的执行时间可能会突然变长几百倍?