相关疑难解决方法(0)

如何从HashSet <T>中检索实际项目?

我已经读过这个问题,为什么它不可能,但没有找到问题的解决方案.

我想从.NET中检索一个项目HashSet<T>.我正在寻找一种具有此签名的方法:

/// <summary>
/// Determines if this set contains an item equal to <paramref name="item"/>, 
/// according to the comparison mechanism that was used when the set was created. 
/// The set is not changed. If the set does contain an item equal to 
/// <paramref name="item"/>, then the item from the set is returned.
/// </summary>
bool TryGetItem<T>(T item, out T foundItem);
Run Code Online (Sandbox Code Playgroud)

使用这种方法搜索集合的项目将是O(1).从a中检索项目的唯一方法HashSet<T>是枚举所有O(n)项.

除了自己制作HashSet<T>或使用之外,我还没有找到解决这个问题的方法Dictionary<K, V>.还有其他想法吗?

注意:
我不想检查是否HashSet<T> …

.net c# hashset

77
推荐指数
4
解决办法
6万
查看次数

为什么我不能在没有枚举的情况下从HashSet中检索项目?

我正在寻找洞察HashSet设计师的头脑.据我所知,我的问题适用于Java和C#HashSets,让我觉得必须有一些很好的理由,尽管我自己也想不到.

在我将项目插入HashSet之后,为什么在没有枚举的情况下检索该项目是不可能的,几乎不是有效的操作?特别是因为HashSet以支持有效检索的方式显式构建.

使用Remove(x)和Contains(x)返回正在删除或包含的实际项目通常很有用.这不一定是我传递给Remove(x)或Contains(x)函数的项目.当然,我想我可以通过HashMap实现同样的效果,但是为什么在完全有可能用套装完成时却浪费了所有的空间和努力?

我可以理解,可能存在一些设计问题,即添加此功能将允许使用HashSet,这与其角色或框架中的未来角色不一致,但如果是这样,那么这些设计问题是什么?

编辑

要回答更多问题,请参阅以下详细信息:

我使用带有重写的hashcode,equals等的不可变引用类型来模拟C#中的值类型.假设类型有成员A,B和C.Hashcode,equals等仅依赖于A和B.给定A和BI希望能够从hashset中检索该等效项并得到它C.我赢了它似乎可以使用HashSet,但我至少想知道这是否有任何充分的理由.伪代码如下:

public sealed class X{
 object A;
 object B;
 object extra;

 public int HashCode(){
  return A.hashCode() + B.hashCode();
 }

 public bool Equals(X obj){
  return obj.A == A && obj.B == B;
 }
}

hashset.insert(new X(1,2, extra1));
hashset.contains(new X(1,2)); //returns true, but I can't retrieve extra
Run Code Online (Sandbox Code Playgroud)

c# java hashset

33
推荐指数
2
解决办法
3万
查看次数

关于字符串实习和替代

我有一个大文件,其本质上包含如下数据:

Netherlands,Noord-holland,Amsterdam,FooStreet,1,...,...
Netherlands,Noord-holland,Amsterdam,FooStreet,2,...,...
Netherlands,Noord-holland,Amsterdam,FooStreet,3,...,...
Netherlands,Noord-holland,Amsterdam,FooStreet,4,...,...
Netherlands,Noord-holland,Amsterdam,FooStreet,5,...,...
Netherlands,Noord-holland,Amsterdam,BarRoad,1,...,...
Netherlands,Noord-holland,Amsterdam,BarRoad,2,...,...
Netherlands,Noord-holland,Amsterdam,BarRoad,3,...,...
Netherlands,Noord-holland,Amsterdam,BarRoad,4,...,...
Netherlands,Noord-holland,Amstelveen,BazDrive,1,...,...
Netherlands,Noord-holland,Amstelveen,BazDrive,2,...,...
Netherlands,Noord-holland,Amstelveen,BazDrive,3,...,...
Netherlands,Zuid-holland,Rotterdam,LoremAve,1,...,...
Netherlands,Zuid-holland,Rotterdam,LoremAve,2,...,...
Netherlands,Zuid-holland,Rotterdam,LoremAve,3,...,...
...
Run Code Online (Sandbox Code Playgroud)

这是一个数千兆字节的文件.我有一个类读取此文件并将这些行(记录)公开为IEnumerable<MyObject>.这MyObject有几个属性(Country,Province,City,...)等.

如您所见,存在大量重复数据.我想继续公开底层数据IEnumerable<MyObject>.但是,其他一些类可能(并且可能会)对这些数据进行一些分层视图/结构,如:

Netherlands
    Noord-holland
        Amsterdam
            FooStreet [1, 2, 3, 4, 5]
            BarRoad [1, 2, 3, 4]
            ...
        Amstelveen
            BazDrive [1, 2, 3]
            ...
         ...
    Zuid-holland
        Rotterdam
            LoremAve [1, 2, 3]
            ...
        ...
    ...
...
Run Code Online (Sandbox Code Playgroud)

在阅读这个文件时,我基本上就是这样做的:

foreach (line in myfile) {
    fields = line.split(",");
    yield return new MyObject {
        Country = fields[0], …
Run Code Online (Sandbox Code Playgroud)

.net c# string hashset string-interning

11
推荐指数
1
解决办法
1143
查看次数

从O(1)中的HashSet <T>获取一个相等的对象

A HashSet<T>可以在O(1)中确定它是否包含某个项目.如果我覆盖Equals()GetHashCode()在我的自定义类上,我可以有一个对象A和另一个对象A',它们相同,但是Equals()返回trueGetHashCode()返回相同的哈希码.

现在,假设A在哈希集中,我想在给定A'的O(1)中检索A(从哈希集的角度看它等于A).

var a = new MyClass("A");
var a_prime = new MyClass("A");
Debug.Assert(a.Equals(a_prime));
Debug.Assert(a.GetHashCode() == a_prime.GetHashCode());

var set = new HashSet<MyClass>();
set.Add(a);
Debug.Assert(set.Contains(a_prime));

// This:    
var retrieved_a = set.Get(a_prime);
Run Code Online (Sandbox Code Playgroud)

这该怎么做?

(请注意,已经不是我要找的答案,这个没有答案的.)


一些背景信息:我想使用set来实习我自己的对象,就像C#interns strings一样:等于对象只需要一个实例.通过这种方式,我可以将元数据附加到这样的对象,并确保没有该元数据,在任何地方都没有其他相同的实例.

c# set

8
推荐指数
1
解决办法
1576
查看次数

标签 统计

c# ×4

hashset ×3

.net ×2

java ×1

set ×1

string ×1

string-interning ×1