半词典

时间:2011-09-16 06:43:26

标签: c# .net-4.0

对于.Net 4中的每个匹配哈希码,是否存在返回IEnumerable<object>IEnumerable<T>的事情?也就是说,我想要一些只使用GetHashCode()而忽略等于运算符的东西。


在所有这些评论之后,我以为我在错误的树上咆哮了一会儿。但我找到了这些家伙。虽然这是一个.net 2实现......但至少有一些人认为使用哈希键进行1:n映射是一个好主意。请参阅http://recursionsw.com/Products/csharp.html

下的HashMap说明

2 个答案:

答案 0 :(得分:1)

您可以使用ToLookup<>。但我不确定这是你真正想要的。一个例子

public class MyClass
{
    public int Num = (new Random()).Next(100);
}

var manyA = new List<MyClass>();

var groupedByHash = manyA.ToLookup(p => p.GetHashCode());

现在,groupsByHash中的每个组都将包含共享相同哈希码的所有元素。你可以认为它们与你的标准“相等”。

答案 1 :(得分:0)

如果我理解你的问题,这可能就是你想要的:

var myEnumerator = 
  from mo in myObjects where mo.GetHashCode() == SOME_HASH_TO_MATCH select mo;

这将为您提供枚举具有特定哈希码的所有对象(myObjects)的方法。

更新

根据您的评论,也许是这样的?

Dictionary<int, List<object>> myDataStructure;

void AddItem(object item)
{
    int hashCode = item.GetHashCode();

    if (!myDataStructure.ContainsKey(hashCode)
    {
        myDataStructure.Add(new List<object>());
    }

    myDataStructure[hashCode].Add(item);
}

List<object> GetItems(int hashCode)
{
    if (!myDataStructure.Contains(hashCode))
    {
        return null; 
    }
    return myDataStructure[hashCode];
}

当然,您可以将访问方法和myDataStructure包装在一个类中,或者为访问方法创建extension methods