Int32?与 IComparable

2024-06-28

我有一个 DataGridView,其数据源是 BindingList。 MyObj 有一些可为 null 的属性(如 int?和 DateTime?) 我想对我的绑定列表实现排序,以便当用户单击列标题时 DataGridView 可以对列进行排序。

经过一番挖掘后,我找到并遵循了这个问题的答案(DataGridView 使用业务对象进行列排序 https://stackoverflow.com/questions/280948/datagridview-column-sorting-with-business-objects).

我无法让该解决方案适用于 Nullable 类型,因为它们没有实现 IComparable。即使对于像 String 这样实现 IComparable 的类,当 String 具有 null 值时,ApplySortCore(...) 也会失败。

有解决办法吗?或者我是否必须为“Int32”实现一个包装类? ?

eg

public class Int32Comparable : IComparable
{
    public int? Value { get; set; }

    #region IComparable<int?> Members

    public int CompareTo(object other)
    {
        // TODO: Implement logic here
        return -1;
    }

    #endregion
}

Nullable<int>可能不会实施IComparable,但可以肯定的是int做。和Nullable<T>总是装箱到T(例如,当您投射到接口时,例如IComparable,这是拳击转换)。因此,对可为空的属性进行比较/排序应该不是问题。

int? value = 1;
IComparable comparable = value; // works; even implicitly

因此,顶部示例中的检查无法正常工作。尝试这个:

Type interfaceType = prop.PropertyType.GetInterface("IComparable");
// Interface not found on the property's type. Maybe the property was nullable?
// For that to happen, it must be value type.
if (interfaceType == null && prop.PropertyType.IsValueType)
{
    Type underlyingType = Nullable.GetUnderlyingType(prop.PropertyType);
    // Nullable.GetUnderlyingType only returns a non-null value if the
    // supplied type was indeed a nullable type.
    if (underlyingType != null)
        interfaceType = underlyingType.GetInterface("IComparable");
}
if (interfaceType != null)
   // rest of sample

另一项补充:如果您希望空值也能工作(字符串和可为空类型),您可以尝试重新实现SortCore(...):

protected override void ApplySortCore(PropertyDescriptor prop, ListSortDirection direction)
{
    IEnumerable<MyClass> query = base.Items;
    if (direction == ListSortDirection.Ascending)
        query = query.OrderBy( i => prop.GetValue(i) );
    else
        query = query.OrderByDescending( i => prop.GetValue(i) );
    int newIndex = 0;
    foreach (MyClass item in query)
    {
        this.Items[newIndex] = item;
        newIndex++;
    }
    this.OnListChanged(new ListChangedEventArgs(ListChangedType.Reset, -1));
}

无需寻找IComparable直接让排序方法自己排序就可以了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Int32?与 IComparable 的相关文章

  • 如何使用OpenCV的归一化相关性?

    如何使用 OpenCV 的归一化相关性 有人可以提供代码示例吗 我的问题 我有一个螺丝头图像 需要找到螺丝的中心 所以我正在考虑使用 OpenCV 相关性 这是一个好主意吗 您可以在下面的链接下找到示例图像 http imageshack
  • 分段错误(核心转储)

    当我尝试运行此程序时 出现分段错误 核心转储 它编译完美 但我收到错误 我不知道为什么 我已尝试以所有可能的方式编辑我的代码 但仍然收到此错误 我已经没有主意了 任何帮助都会很棒 谢谢 unsigned short reg NULL int
  • 为什么尝试块很昂贵?

    我听说过这样的建议 如果可能的话 您应该避免使用 try catch 块 因为它们很昂贵 我的问题专门针对 NET 平台 为什么 try 块很昂贵 回应摘要 在这个问题上显然有两个阵营 一些人说 try 块很昂贵 另一些人则说 也许有点点
  • 在 C++ 中将注册表值设置为宽字符串 (WCHAR)

    我正在尝试在 C 中向注册表添加宽字符串 问题是RegSetValueEx 函数不支持宽字符 仅支持BYTE type BYTE unsigned char WCHAR myPath C exe RegSetValueExA HKEY CU
  • 使用 Javascript 隐藏数据网格列?

    我有一个包含大约 20 列的 net 数据网格 我需要使用 JavaScript 通过单击按钮来切换列的可见性 有任何想法吗 您想使用 COLGROUP 来执行此操作 否则您必须应用样式every细胞开启everyrow 这将非常低效 并且
  • 将数据路径数据到树状数据结构

    我有以下数据 root root blue root blue temp root main root main dev root main back root etc init root etc init dev root etc ini
  • 泛型类中可空的泛型字段

    我正在尝试做这样的事情 public class MySuperCoolClass
  • “constexpr”有什么用?

    我实在是找不到它有什么用处 我的第一个想法是我可以用它来实现 按合同设计 而不使用如下宏 struct S S constexpr int i S i static assert i lt 9 i must be lt 9 S int i
  • Windows窗体C#通过代码改变用户控件

    我有一个 Windows 窗体 我不想将任何其他 Windows 窗体设置为一个 Windows 窗体和不同的用户控件 如何在用户控件之间进行更改 例如以编程方式隐藏一个用户控件并显示另一个用户控件 private void Btt inf
  • 无锁“如果不为零则递减”

    我目前正在用 C 重新发明线程池的轮子 我已经消除了代码中的几乎所有锁 除了以下构造的多个实例之外 std atomic size t counter void produce counter void try consume if cou
  • 使用迭代器与索引访问向量元素有什么区别?

    使用迭代器与索引访问向量元素有什么优点 为什么迭代器比索引更好 在索引不可用的情况下 例如 std list 对于 例子 在通用函数接受迭代器的情况下 叫做 编写应该使用的函数模板时 不止一种容器类型 他们的存在是为了创造均匀性在所有容器和
  • 将“列表”项附加到 StringBuilder

    我尝试将项目附加到List
  • Json.Net 反序列化 JSON 对象,索引为名称 [重复]

    这个问题在这里已经有答案了 我尝试使用 Json NET 从 Web 服务解析 JSON 该 Web 服务返回以下格式的数据 0 ID 193 Title Title 193 Description Description 193 Orde
  • 用于了解 web.config 要点的资源

    了解使用 web config 设置可以 或不可能 实现什么效果的最佳资源是什么 维基百科目前确实缺乏答案 而且我浏览过的许多网站仅引用和解释了一两个配置 好吧 我想你需要这个 ASP Net 配置 http msdn microsoft
  • C# 我可以访问没有完整限定名称的枚举吗

    我有一个 C 枚举类型 它以非常长的限定名称结尾 例如 DataSet1 ContactLogTypeValues ReminderToFollowupOverdueInvoice 为了便于阅读 如果我可以告诉一个特定的函数只使用名称的最后
  • 在 C++ 中调用函数有多少开销?

    许多文献都谈到使用内联函数来 避免函数调用的开销 但我还没有看到可量化的数据 函数调用的实际开销是多少 即通过内联函数我们可以实现什么样的性能提升 在大多数架构上 成本包括将所有 或部分 或没有 寄存器保存到堆栈 将函数参数推送到堆栈 或将
  • 反序列化 jQuery 序列化表单

    我正在尝试将表单输入传递到 WebMethod 中并执行某些操作 我用了jQuery 序列化 http api jquery com serialize
  • Sharepoint 客户端 GetFolderByServerRelativeUrl 文件夹修改日期

    我试图在使用 GetFolderByServerRelativeUrl 函数时检索文件夹的 修改日期 和 创建日期 我该怎么做 我只能从中获取relativeUrl 和文件夹名称 下面是我为检索文件夹所做的操作 请帮忙 FolderColl
  • 如何更改母版页中控件的值?

    如何更改控件的值 例如用户控件中的文字 并且该用户控件位于母版页中 我想从内容页更改该文字的值 System Web UI UserControl this Page Master FindControl ABC FindControl X
  • DllImport 名称不完整

    我在 NET 下使用多个 P Invoke 但是 我希望我的库能够在 Windows 和 Linux 上运行 最好使用相同的二进制文件 由于我所依赖的本机库可在多个平台上使用 因此我希望将它们与我的托管库的二进制文件一起使用 现在我正在使用

随机推荐

  • PNG 文件中的 Adler-32 校验和

    我目前正在编写一个 C 程序 该程序从另一个生成的数据文件构建 PNG 图像 该图像是调色板类型 Adler 32 校验和是根据未压缩数据计算得出的吗 a IDAT 数据块中的每个压缩块 b IDAT 数据块中的所有压缩块 c 跨越所有 I
  • 如何连接W10通用App和MySQL数据库

    我正在编写第一个在 MySql 数据库上运行的 Windows 10 通用应用程序 我使用了本指南中的代码 适用于 Windows 8 商店应用程序 https blogs oracle com MySqlOnWindows entry h
  • SwiftUI - 在预览中模拟 @EnvironmentObject 数据

    我有这个代码 struct WelcomeView View EnvironmentObject var userService UserService var body some View Text userService user us
  • 使用 pip 安装软件包时出现“SSL 证书验证失败”

    我正在尝试使用 pip 安装适用于 python 的 Scrapy 包 以及其他包 我尝试使用 python 3 和 python 2 进行安装 我已经安装 升级了 setuptools 如下所示 pip3 install upgrade
  • 回滚Python中的随机数生成器?

    是否可以通过指定的步数将随机数生成器 回滚 到较早的状态以获得重复的随机数 我希望能够做这样的事情 print random random 0 5112747213686085 print random random 0 404934137
  • 在Python中,有什么方法可以测试生成器对象以找出哪个生成器创建了它?

    给定一个生成器对象 是否可以测试它是否是由给定生成器创建的 也许更好的说法是 是否可以测试我们拥有什么 类型 的发电机 由于生成器对象具有类型generator 测试用type or isinstance不管用 考虑下面的代码 gt gt
  • 如何定期调用方法/函数? (time.sleep失败)[重复]

    这个问题在这里已经有答案了 我怎样才能打电话update定期 我尝试了以下操作 但它跳过显示 GUIlimit秒 然后仅显示最后一次更新 import tkinter as tk import time root tk Tk widget
  • 在运行时获取 Azure WebApp/网站名称

    我有一个名为 myapp azurewebsites net 的 Web 应用程序 并且还有一个名为 myapp failover azurewebsites net 的故障转移 它使用 DNS 和流量管理器 因此该站点实际上是 www m
  • 检测Java Swing组件是否被隐藏

    假设我们有以下 Swing 应用程序 final JFrame frame new JFrame final JPanel outer new JPanel frame add outer JComponent inner new Some
  • 是否可以在面向 4.0 的项目中引用面向 .net 4.5 的程序集?

    我有一个针对 net 4 0 的 MVC 3 应用程序 它还有十几个也针对 net 4 0 的项目 我已经为针对 net 4 5 的解决方案创建了一个使用反射的新项目 我想使用 4 5 中的一些不错的功能 当我尝试编译时 出现错误 指出 找
  • 如何忽略或包含普罗米修斯中的特定指标?

    我听说过ignore metrics配置项 它可以用来忽略或包含特定的Prometheus指标 但找不到任何官方文档如何使用它 任何人都可以帮我解决这个问题吗 您可以使用metric relabel configs过滤掉已经抓取的值 因此
  • R ggplot2:可以自定义时间尺度的连续性吗?

    是否有可能有一个日期时间尺度而不将周末视为时间连续体的一部分 例如 如果我用线条几何图形绘制 2 周内的股票价格 我不想在周末绘制 2 天的平坦期 我希望周五与周一联系 我想有更好的方法 但是您始终可以只使用绘图的索引 然后将日期指定为标签
  • 是否有可能降低这个 Javascript 算法解决方案的复杂性和意大利面条质量?

    问题 创建一个将两个参数相加的函数 如果仅提供一个参数 则返回一个需要一个参数并返回总和的函数 例如 addTogether 2 3 应返回 5 addTogether 2 应返回一个函数 使用单个参数调用此返回函数将返回总和 var su
  • 无法在 Android 4.4 KitKat 上快速关闭 ChunkedInputStream

    我有一个 Android Daydream 它使用 Twitter4j 的流实现来显示推文流 这在 Android 4 2 和 4 3 上运行良好 然而 在 4 4 上 我无法快速关闭流 在onDreamingStopped 我越来越这个堆
  • Nvidia 与 AMD 的内存分配

    我知道 AMD GPU 上的单个 GPU 内存块有 128MB 的限制 Nvidia GPU 是否也有类似的限制 您可以在运行时使用 clGetDeviceInfo 和 CL DEVICE MAX MEM ALLOC SIZE 查询此信息
  • 处理 DataGridView 中的空单元格

    我想为 DataGridView 的某些单元格为空或空时编写一个条件 例如 如果 cells 1 不为 null 或empty 则必须运行一个方法并且 我以某种方式编写了它 但其中一些不起作用 其中一个起作用了 但它不是解决我的问题的好方法
  • Blazor - 无法从“方法组”转换为“EventCallback”

    我有一个父组件和一个带有事件回调的子组件 我希望它传回 T 类型 我遇到的问题是转换时出现错误 方法组到事件回调 如果我将其转换为使用Action然后它就可以工作 但我不能异步执行 这并不理想 有什么想法我做错了吗 Parent
  • 如何让选项菜单出现在屏幕底部?

    这就是我想要实现的 当人们单击工具栏右上角的菜单时 选项菜单会出现在屏幕底部 见下图 我不确定应该为底部的项目调用什么方法 有人可以给我一些关于如何实现这个的提示吗 我使用下面的代码成功实现了右上角菜单栏中的图标 但我不知道如何在屏幕底部显
  • 高级 LaTeX 教程/书籍 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我使用 LaTeX 已经大约 3 4 年了 在那段时间里 我经常通过谷歌搜索找到我需要的东西 然而 我想学习 LaTeX 的一些更高级的功
  • Int32?与 IComparable

    我有一个 DataGridView 其数据源是 BindingList MyObj 有一些可为 null 的属性 如 int 和 DateTime 我想对我的绑定列表实现排序 以便当用户单击列标题时 DataGridView 可以对列进行排