Tag: hashset

迭代HashSet的最快/最安全的方法是什么?

我还是C#的新手,但是在特定情况下通过论坛发帖使用HashSet而不是List来注意到这些优势。 我目前的情况并不是说我在一个List存储了大量的数据,而是我不得不经常检查它的成员。 问题是我确实需要迭代它,但它们存储或检索的顺序实际上并不重要。 我已经读过,因为每个循环实际上比下一个循环慢,所以我怎么能用尽可能快的方法来解决这个问题呢? 我正在做的.Contains()检查的数量肯定会损害我的列表性能,所以至少与HashSet的性能相比会很方便。 编辑:我目前正在使用列表,在许多位置迭代它们,并且在每个位置执行不同的代码。 大多数情况下,当前列表包含点坐标,然后我用它来引用二维数组,然后根据列表的标准执行某些操作或其他操作。 如果我的问题没有直接的答案,那很好,但我认为可能有其他方法迭代HashSet而不仅仅是foreach循环。 我目前处于黑暗状态,甚至可能有其他方法,它们提供了哪些优势等等。假设还有其他方法,我还假设有一种典型的首选方法,只有在它不能满足需求(我的需求非常基本)。 至于过早优化,我已经知道使用列表,因为我是一个瓶颈。 如何解决这个问题是我陷入困境的地方。 甚至没有完全卡住,但我不想通过重复测试来重新发明轮子只是为了发现我已经尽力做到这一点(这是一个投资超过3个月的大型项目,列表无处不在,但肯定有一些我不想重复,有大量数据,不需要以任何特定顺序存储,等等。

在C#中,为什么从List创建HashSet更快,而不是从HashSet开始?

我有一个采用上限的方法,并返回一个素数列表,直到该限制。 public static List AllPrimesUnder(int upperLimit) 我后来决定我真的只需要在列表上进行查找,通常只是询问“Is This Prime”这个问题。 由于我在处理价值百万的所有素数时,我意识到HashSet是我应该使用的结构。 当然使用该方法的结果查找速度更快,但该方法的自身速度较慢 。 我认为它较慢的原因是因为HashSet在添加之前检查重复项,而List只是在最后推送它。 令我惊讶的是,产生问题和标题的原因是为什么从List开始并使用它来创建HashSet,如下所示: hashSet = new HashSet(Prime.AllPrimesUnder(1000000)); 比使用方法内部的Hashset更快,启用如下调用: hashSet = Prime.AllPrimesUnder_Hash(1000000); 如果减速是在重复检查中,则无论如何都应该进行相同数量的检查,对吧? 这可能是我理解失败的地方。 以下是我获得100万以下素数的时间。 0.1136s Pure Hash 0.0975s纯清单( 预计会更快 ) 0.0998s Pure List转换为Hash( 未预期 ) 如果可以用简单的术语解释原因,我很乐意听到。 我想至少我正在寻找足够的理解知道我是否应该从List或HashSet开始,如果最终结果将是一个大的HashSet项。 我在下面添加了prime方法的主体,但请注意,与数据结构的所有交互在两者之间是相同的(代码方式)。 我不相信我如何添加数据到结构应该影响exception。 public static List AllPrimesUnder(int upperLimit) { List primeList = new List(); primeList.Add(2); int testNumber = […]

C#:字典值到hashset转换

请建议将Dictionary转换为Hashset的最短路径 IEnumerables是否内置ToHashset() LINQ扩展? 先感谢您!

C#HashSet Generic允许重复

在MSDN上读取HashSet,它用HashSet ,如果T实现IEquatable则HashSet将此用于IEqualityComparer.Default 。 所以,让class级人员: public class Person : IEquality { private string pName; public Person(string name){ pName=name; } public string Name { get { return pName; } set { if (pName.Equals(value, StringComparison.InvariantCultureIgnoreCase)) { return; } pName = value; } } public bool Equals(Person other) { if(other==null){return false;} return pName.Equals(other.pName, StringComparison.InvariantCultureIgnoreCase); } public override bool Equals(object […]

C#XNA Xbox HashSet和Tuple

C#XNA Xbox,在这种情况下,可选参数不是可选的 感谢上述问题的帮助,可选参数现在正在运行,或者至少看起来好像它们应该有效。 但是我现在卡在HashSets和Tuples上,它们似乎也没有。 我可以编写自己的两个类的版本。 从头开始的元组和使用Dictonary(可能)的HashSet。 但是我宁愿继续使用标准的。 如果这些类存在于库的PC版本中,那么我可以将它们从PC C#库复制并粘贴到我自己的代码中吗? 使用“转到定义”会导致“HashSet [来自元数据]”并且是C ++头文件,就像它显示类接口但没有实现。 接下来是: stackoverflow.com/questions/10246572/c-sharp-hashset2-to-work-exactly-like-the-standard-c-sharp-hashset-not-compilin

用于雾化T的.Net集合?

我正在寻找是否存在适用于雾化一般类型T的预先存在的.Net“Hash-Set类型”实现。我们有大量相同的对象进入序列化源,需要雾化以节省内存。 Dictionary with the value == key的Dictionary with the value == key完美地工作,但是这些集合中的对象在整个应用程序中可以运行数百万,因此将2个引用存储到每个对象似乎非常浪费。 HashSet不能用,因为它只有Contains,有吗?没办法? 到达实际的成员实例。 显然我可以自己滚动,但想检查是否有任何预先存在的东西。 在C5的扫描没有看到任何跳出来,但然后他们250多页的文档确实让我想知道我是否错过了什么。 编辑 最基本的想法是我需要能够获得独特的对象后退,即HashSet包含(T obj)但不是Get(T obj) / EDIT 最糟糕的集合只需要实现: T GetOrAdd(T candidate) void Clear() 并采用仲裁IComparer和GetOrAdd是~O(1)并且理想情况下是primefaces的,即不浪费时间Hashing两次。 编辑如果没有现有的实施,我们将不胜感激任何关于基本哈希/搭讪技术来源的建议。 – 已经指出了Mono HashSet源代码,因此本节回答/编辑

更快计算项目出现的套数?

我有一个书签列表。 每个书签都有一个关键字列表(存储为HashSet)。 我还有一组所有可能的关键字(“宇宙”)。 我想找到大多数书签中出现的关键字。 我有1356个书签,总共有698,539个关键字,其中187,358个是唯一的。 如果我遍历Universe中的每个关键字并计算它出现的书签数量,我就会进行254,057,448次检查。 我的机器需要35秒。 算法非常简单: var biggest = universe.MaxBy(kw => bookmarks.Count(bm => bm.Keywords.Contains(kw))); 使用Jon Skeet的MaxBy 。 我不确定是否有可能加快这个速度,但有什么我可以做的吗? 也许以某种方式并行化它? dtb的解决方案需要不到200毫秒来构建宇宙并找到最大元素。 很简单。 var freq = new FreqDict(); foreach(var bm in bookmarks) { freq.Add(bm.Keywords); } var biggest2 = freq.MaxBy(kvp => kvp.Value); FreqDict只是我在Dictionary之上构建的一个小类。

.Net HashSet唯一性计算完全基于哈希码吗?

我想知道.Net HashSet是完全基于哈希码还是它也使用相等? 我有一个特定的类,我可能会实例化数百万个实例,并且有一些合理的可能性,即某些哈希码将在该点发生冲突。 我正在考虑使用HashSet来存储这个类的一些实例,我想知道它是否真的值得做 – 如果一个元素的唯一性只是在它的哈希码上确定那么对我来说对于实际的应用程序没用 MSDN文档在这个主题上似乎相当含糊 – 任何启示都会受到赞赏

如果您改变其身份,HashSets不会保持元素的唯一性

在C#中使用HashSets时,我最近遇到了一个恼人的问题: HashSets不保证元素的单一性; 它们不是套装。 他们所保证的是,当调用Add(T item)如果set item.equals(that)中的任何项为true item.equals(that)则不添加item.equals(that) 。 如果您操作集合中已有的项目,则不再存在。 一个小程序,演示(来自我的Linqpad的copypasta): void Main() { HashSet testset = new HashSet(); testset.Add(new Tester(1)); testset.Add(new Tester(2)); foreach(Tester tester in testset){ tester.Dump(); } foreach(Tester tester in testset){ tester.myint = 3; } foreach(Tester tester in testset){ tester.Dump(); } HashSet secondhashset = new HashSet(testset); foreach(Tester tester in secondhashset){ tester.Dump(); } } class […]

初始化集合时,hashset对内存有什么作用?

我偶然发现了以下问题。 我想要一个所有数字从1到100.000.000的哈希集。 我尝试了以下代码: var mySet = new HashSet(); for (var k = 1; k <= 100000000; k++) mySet.Add(k); 那个代码没有成功,因为我在49mil附近的内存溢出。 这也很慢,内存增长过度。 然后我尝试了这个。 var mySet = Enumerable.Range(1, 100000000).ToHashSet(); 其中ToHashSet()是以下代码: public static HashSet ToHashSet(this IEnumerable source) { return new HashSet(source); } 我再次获得了内存溢出,但是我能够使用之前的代码输入更多数字。 有效的方法如下: var tempList = new List(); for (var k = 1; k <= 100000000; k++) tempList.Add(k); […]