问题标签 [icomparer]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1063 浏览

.net - 什么时候比较器会让 Sort 抛出 ArgumentException?

Sort的文档说,如果“比较器的实现在排序过程中导致错误。例如,比较器在将项目与自身进行比较时可能不会返回 0”,Sort 将抛出 ArgumentException。

除了给出的例子之外,谁能告诉我什么时候会发生这种情况?

0 投票
1 回答
1531 浏览

c# - IComparer 问题 + 如何在 .NET 中自然地对字符串数组(FILE_10 > FILE_2)进行排序?

在我的帖子底部解决。

或者更具体地说:

我有一堆 FileInfo 对象(我需要 FileInfo 对象来排除隐藏、系统和重新分析点文件)。

我需要根据 FileInfo.FullName 自然地对 FileInfo[] 进行排序。所以 FILE_10.ext 应该在 FILE_2.ext 之后。幸运的是 FileInfo[] 只包含一个扩展名的文件。

我已经实现了一个比较器:

现在问题出现了,int.Parse 抛出了一个溢出异常,我无法在正确的位置捕获它(由于某种原因,它再次出现在 return 语句的行上,我无法在更上一层智能地处理它,因为它永远不会到达那里)。

问题是:这种事情是否有预先实现的比较器?异常出现在有趣的地方的原因可能是什么?

调用代码:

EDIT1: Int.Parse 在遇到太大的数字时抛出 OverflowException。它不应该经常发生,但我希望它被覆盖。

EDIT2:我最终调整了自己的比较器。离开了 int.Parse 并且只是用零填充以进行比较。代码在这里:

0 投票
8 回答
31442 浏览

.net - 何时使用 IComparable比。比较器

我试图弄清楚我需要实现哪些接口。他们基本上都做同样的事情。我什么时候会使用其中一个?

0 投票
7 回答
3973 浏览

c# - 使用 IComparer 随机播放

首先,我知道Fisher-Yates shuffle。但是,为了争论,我想允许用户从下拉列表中选择一个排序选项。该列表将包括一个“随机”选项。根据他们的选择结果,我只想用 IComparer 实例替换我的排序。IComparer 会是什么样子?

谷歌提出了大量有缺陷的结果,它们都采用这种形式:

但是,这种实现是有偏见的,在某些情况下甚至会抛出异常。偏差可以用下面的代码来证明:

那么如何实现一个随机IComparer<T>的来解决这些问题呢?允许要求每次调用都.Sort()使用单独的 IComparer 实例,因为我看不到任何其他方法可以做到这一点:必须使用其他一些真正随机的值来比较项目但该值也必须与项目一致在给定的排序操作中。

我在这里有一个开始,但它是匆忙发布的,非常慢,甚至没有返回所有可能的类型(测试表明它至少消除了偏见,如果你不计算缺失的选项)。我不希望像 Fisher-Yates 那样的 O(n) 性能,但我确实想要一些合理的东西(n log n 表示小的 n),我确实希望它能够显示所有可能的类型。不幸的是,该链接是该问题的当前公认答案,因此我希望能够用更好的东西替换它。

如果不出意外,我希望这能吸引所有那些寻找 IComparable 解决方案的谷歌查询——他们最终会在这里而不是在其他地方告诉他们使用不正确的版本。

0 投票
4 回答
8604 浏览

vb.net - SortedList 未按键排序 - VB.NET

我需要要排序的键值对,所以我决定使用 SortedList 而不是 HashTable。

我按以下顺序将数据添加到我的 SortedList 中,这是我需要的顺序

键是字符串,值是对象列表。键表示一个时隙,该时隙由两个整数值连接并由“-”分隔。“700”作为一个字符串,最初是一个整数 0700。

例如

但是一旦将这些键值对添加到 SortedList 中,它们就会按顺序出现

不幸的是,我将时隙作为两个无法更改的整数值接收。

有没有办法强制对 SortedList 进行排序?或者这个问题是因为我存储密钥的方式?有没有更好的存储方法?

0 投票
1 回答
2565 浏览

arrays - List.Sort IComparer 性能

我正在尝试对一对 int 数组进行排序 (int[] a; int[] b;)

如果我使用 Array.Sort(a,b) 那么性能很棒。

但是,我更喜欢使用 List<> 并将 int 对加载到结构中。我可以使用带有重载的 Array.Sort() 来实现它,该重载为结构提供了一个简单的比较器,但它比 Array.Sort(a,b) 慢了大约 4 倍

这正常吗?

0 投票
5 回答
92915 浏览

c# - 使用自己的 IComparer使用 Linq OrderBy

我有一个通用的

whereMyClass有一个InvoiceNumber包含以下值的属性:

200906/1
200906/2
..
200906/10
200906/11
200906/12

我的列表绑定到

支持使用 linq 进行排序:

然而,默认的比较器排序(如假设的那样)如下:

200906/1
200906/10
200906/11
200906/12
200906/2

在这种情况下这是令人讨厌的。

现在我想用我自己IComparer<T>的。它看起来像这样:

并更改ApplySortCore代码以使用它IComparer

当我调试我的代码时,我看到它MyComparer.Compare(object, object)被多次调用并为比较方法返回正确的值(-1、0、1)。

但是我的列表仍然以“错误”的方式排序。我错过了什么吗?我没有线索。

0 投票
3 回答
12355 浏览

c# - 修改 List.Contains 行为

我有一个List<MyObj>class MyObj : IComparable. CompareTo我在每个接口的MyObj类中编写了方法IComparable,但是当我使用它时,它应该List<MyObj>.Contains(myObjInstance)返回。falsetrue

我不确定我是否理解我需要如何继续以确保在调用 then函数List时使用我的自定义比较方法。Contains

这是我的 compareTo 实现:

注意 Symbol 属性是一个字符串。

为了澄清,我在 compareTo 方法中设置了一个停止点,它甚至没有进入那里。

有人试过吗?

谢谢。

0 投票
2 回答
8999 浏览

c# - 用于列表(排序)的自定义 IComparer 的问题 - c#

谁能帮忙,我做排序有问题,我以为我已经排序但似乎没有工作。

我有一个存储以下值的列表

8,6,10,11,7

我还有另一个列表(我的类中的附件,它有一个名为 accessoryId 的属性,当前类的 id 顺序为 6、7、8、10、11)

因此,我需要将它们从 6、7、8、10、11 排序到简单列表中使用的顺序,即 8、6、10、11、7

我有我的 icomparable (见下文),我这样打电话 - 它确实输入但有问题,因为列表仍然包含我的所有课程,但仍按 6、7、8、10、11 的顺序

0 投票
3 回答
219 浏览

.net - 有状态的 IComparer 是否存在合理的场景?

我从来没有用IComparer<T>默认构造函数写过有状态的。我在 Reflector 中检查的所有标准库实现也是无状态的。因此,我想假设我可以IComparer<T>像这样自由地缓存:

代替

所以这里有一个问题:你有没有写过/看过一个IComparer<T>这会崩溃的?如果是,它有多普遍?

编辑:在这种情况下,我真的不想要第二个版本的开销的原因是数据结构是持久的。它被实现为一棵树,其中节点没有父/根引用。所以它不是每个队列对比较器的一个引用,而是每个节点对比较器的一个引用!我最初的设计只是使用IComparable<T>并建议编写一个包装结构来进行自定义比较。