如何使用 IComparable 之类的方法自然地对 DataView 进行排序

2024-01-30

我的 DataView 表现得很有趣,它按字母顺序对事物进行排序,而我需要它按数字对事物进行排序。我在整个网络上查找了这个问题,发现了很多关于如何使用 ICompare 对其进行排序的想法,但没有什么真正可靠的。

所以我的问题是

  1. 如何在 DataView 上实现 ICompare(在此处查找代码)。
  2. 如何正确地从一列充满字符串的实际字符串和一列充满数字(带逗号)的列中正确解密。

我需要代码来帮助我解决这个问题。我或多或少迷失了 ICompare 的想法以及如何在不同的场景中实现,因此总体上很好的解释会很棒。

另外,请不要给我链接。我正在寻找关于这个问题的可靠答案。

我使用的一些代码。

    DataView dataView = (DataView)Session["kingdomData"];
    dataView.Sort = e.SortExpression + " " + ConvertSortDirectionToSql(e.SortDirection);
    gvAllData.DataSource = dataView;
    gvAllData.DataBind();



    private string ConvertSortDirectionToSql(SortDirection sortDirection)
{
    string newSortDirection = String.Empty;
    if (Session["SortDirection"] == null)
    {
        switch (sortDirection)
        {
            case SortDirection.Ascending:
                newSortDirection = "ASC";
                break;
            case SortDirection.Descending:
                newSortDirection = "DESC";
                break;
        }
    }
    else
    {
        newSortDirection = Session["SortDirection"].ToString();
        switch (newSortDirection)
        {
            case "ASC":
                newSortDirection = "DESC";
                break;
            case "DESC":
                newSortDirection = "ASC";
                break;
        }
    }
    Session["SortDirection"] = newSortDirection;
    return newSortDirection;
}

对于该场景,我动态构建一个数据表并将其推入数据视图中,在其中将数据视图放入网格视图中,同时还记得将数据视图放入会话对象中以实现排序功能。

当用户调用 gridview 对列进行排序时,我会调用会话对象中的 dataview 并构建 dataview 排序表达式,如下所示:

dataview.sort = e.sortexpression + " " + e.Sortdirection; 

或类似的规定。所以通常结果对于所有真实的字符串都是正确的,例如

车;家;斯科特;扎克等...

但是,当我对带有逗号分隔值的数字字段执行相同操作时,结果类似于

900; 800; 700; 600; 200; 120; 1,200; 12,340; 1,000,000;

明白了吗?它只是将项目排序为 alpha 排序而不是自然排序。我想让我的数据视图自然地对数字列进行正确排序,就像

120; 200; 600; 700; 800; 900; 1,200; 12,340; 1,000,000;

让我知道你能做些什么来帮助我。
附:我浏览了无数关于如何做到这一点的文章,他们都说要推入列表/数组并这样做,但是有没有更有效的方法呢?


对于第一个问题 - IIRC,您无法使用比较器对 DataView 进行排序。如果您只需要对字段进行数字排序,则必须确保列类型是数字而不是字符串。一些代码将有助于阐明这一点。

对于第二个问题,您也不能直接在 DataView 中执行此操作。如果您确实需要根据列中数据的某些处理对记录进行排序,那么我会将数据复制到数组中并在数组上使用 IComparer:

DataView dv = new DataView(dt);
ArrayList lst = new ArrayList();
lst.AddRange(dv.Table.Rows);
lst.Sort(new MyComparer());
foreach (DataRow dr in lst)
    Debug.WriteLine(dr[0]);

比较器是这样的:

    class MyComparer : IComparer
    {
        public int Compare(object x, object y)
        {
            DataRow rx = x as DataRow;
            DataRow ry = y as DataRow;
            string datax = (string)rx[colName];
            string datay = (string)ry[colName];
            // Process datax and datay here then compare them (ASC)
            return datax.CompareTo(datay);
        }
    }

这会增加内存消耗,因此您需要考虑是否有更好的方法来预处理表中的数据,以便您可以直接按列对DataView进行排序。

附: colName 是您想要作为排序依据的列的名称。将注释替换为实际代码以从列中提取排序信息。您还可以使用此方法从更多列中提取排序信息。只需使用这样的东西:

int cmp = colAx.CompareTo(colAy);
if (cmp != 0)
    return cmp;
cmp = colBy.CompareTo(colBx);
return cmp;

这将比较按 colA 值升序比较,然后按 colB 值降序比较(并不是第二个比较有y首先然后x)

Edit:好的,我错误地解释了术语“逗号分隔值”。从你的例子来看,我认为你实际上指的是带有千位分隔符的数字(1,000,000 = 一百万)。如果您在数据库中存储这样的数字,那么您一定正在使用文本字段,这应该是您的排序顺序是字母数字的原因。

基于这个假设,我建议将该列的类型更改为数字,保留普通数字,并仅在显示它们时对其进行格式化(使用千位分隔符)。这样,排序应该直接在 DataView 中进行,而不必复制数据。

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

如何使用 IComparable 之类的方法自然地对 DataView 进行排序 的相关文章

  • 是否有稳定的 ASP.NET 博客控件(设计用于集成到现有站点中)? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我看到了 dotnetblogengine net 并从论坛帖子中得到的印象是 将其集成到现有网站中并
  • 本地主机和 request.Url.Authority

    我的应用程序通过 URL 中的公司标识符分隔用户 company1 app com company2 app com 我正在本地 PC 上进行测试 请求如下 company1 localhost com 但是 我的 request Url
  • 运行 Aero 时如何确定实际窗口窗体大小(包含所有非客户端元素)?

    我试图将我的表单精确定位在任务栏上方 不幸的是 我的努力受到了以下事实的阻碍 this Height在我的表单上返回一个比实际表单 包含所有边框 标题栏等 小 10 像素的值 我正在运行带 Aero 的 Windows 7 当 Aero 关
  • Jquery Ajax 调用返回 403 状态

    我有一个 jquery Ajax 调用来实现会话的 keepalive 这个 keepAlive 方法将每 20 分钟调用一次 function keepAlive ajax type POST url KeepAliveDummy asp
  • File.Move 的原子性

    我想将目录中的文件重命名为原子事务 该文件不会更改目录 该路径作为 NTFS 文件系统的 UNC 路径提供 可能位于服务器 03 或 08 上 File Move 对于这些目的来说是原子的吗 例如 它要么成功完成 要么失败 以使原始文件仍然
  • 为什么smtpclient发送的邮件没有出现在已发送项目中

    我已经实现了一个通过 Net SmtpClient 发送电子邮件的服务器 邮件发送代码如下 private static MailMessage SendMail string to string subject string body M
  • 使用 system.reflection 列出类字段

    我需要获取一个列表来存储类中的所有字段 值 这个班级只是一些公共的const string我在下面粘贴的变量 public class HTDB Cols public class TblCustomers public const str
  • 为什么 DropDownList.SelectedValue 依赖于 viewstate?

    如果我在我的页面上设置 EnableViewState true ViewStateMode Disabled 然后 页面的视图状态被禁用 除非覆盖 然后 尝试读取 假设控件已在上次转储到屏幕时填充并选择了一个值 MyDDL Selecte
  • .NET Framework 中的语言互操作性(基本概念)是什么?

    我正在阅读 NET框架 https en wikipedia org wiki NET Framework维基百科的文章 第一段描述了这个框架的一般概念 它说 它包括一个大型库 并提供跨多种编程语言的语言互操作性 每种语言可以使用用其他语言
  • 无法找到 .NET Core 项目

    我正在关注 c 的 brackeys 教程here https www youtube com watch v N775KsWQVkw 但在 7 55 时 我弹出一条消息 无法找到 NET Core 项目 未生成资产 我已经做了布雷基在那一
  • 在本地计算机中使用 Azure 存储模拟器时找不到上传的图像

    asp net 4 5 Web 表单 vs2013 身份 2 0 实体框架 6 0 我计划使用 Azure 存储 blob 来存储用户上传的图像 因此 我下载了 Azure 存储模拟器来在本地计算机上进行测试 看来容器已正确创建并且图像已正
  • 添加到 .NET 任务栏中的右键单击应用程序菜单

    大多数应用程序只有 恢复 移动 调整大小 最小化 最大化和关闭 但是MS SQL提供了额外的选项 帮助 自定义视图 按照这些思路 是否可以添加到任务栏中应用程序的右键单击菜单 注 我是not指通知区域中时钟旁边的图标 这是一个更简单的ans
  • 为什么“Assembly”和“Module”没有公开定义的构造函数?

    我正在用 C 构建一个 NET 程序集加载器 以进行 实验 了解有关 NET 内部操作的更多信息 我通过派生类型实现了反射 API 例如 运行时类型 类型 运行时字段信息 字段信息 运行时方法信息 方法信息 运行时参数信息 参数信息 运行时
  • RichTextbox SelectionStart 返回错误的索引

    我需要向用户显示光标上文本的选择开始和长度 就像在 notepad exe 中一样 选择长度没有问题 因为 Richtextbox 支持带有开始和结束的选择属性 http msdn microsoft com en us library s
  • ASP.NET MVC - 临时要求除一页之外的整个站点授权的简单方法

    我正在建立一个混合了公共页面和会员专用页面的网站 登录系统按原样工作正常 不过 我想启动一个封闭的 仅限邀请的预览 并暂时要求访问者登录才能执行除欢迎页面之外的所有操作 目前我有 Authorize 某些操作方法的属性 我也可以向其他操作方
  • 等待运算符错误

    我的代码有问题 我怎么解决这个问题 这个问题出现在await操作符中 public MyModel HttpClient client new HttpClient HttpResponseMessage response await cl
  • 多选DataGridView没有CTRL键没有闪烁?

    我在表单 Form1 vb 上有一个 DataGridView 控件 需要允许用户在不使用 CTRL 键的情况下多选行 没有可用的键盘 他们使用触摸屏 我已启用 mutliselect 属性 并在 Form 类中包含以下代码 我的 Data
  • 盒式捆绑包与 MVC4 捆绑包

    我目前正在开发一个原型 ASP NET MVC 3 解决方案 该解决方案将用作多个项目重写的基础 来自 Web 表单 我的目标之一是跨应用程序实现一些脚本管理 而不是我们目前没有的目标 MVC 3有一个缺陷恕我直言 如果您需要在部分视图或模
  • .NET 或 Windows 同步原语性能规范

    我目前正在写一篇科学文章 我需要非常准确地引用 有人可以向我指出 MSDN MSDN 文章 一些已发表的文章来源或一本书 我可以在其中找到 Windows 或 NET 同步原语的性能比较 我知道这些是按性能降序排列的 互锁 API 关键部分
  • 推断“x => { throw .. }”的 Lambda 与重载方法中的 Func 匹配吗?

    我不明白为什么 C 最终在以下 LINQPad 代码中执行不正确的扩展方法 void Main Actual Sync Action Expected Sync Action Run x gt x Dump Actual Async Tas

随机推荐

  • UWP DatePicker 月份的自定义字符串

    我正在为非英语用户做UWP应用程序 我需要使用 DatePicker 但我不喜欢月份名称用英文书写 我也不想用数字值显示月份 如何设置自己的字符串列表以将其显示在月份选择器上 据我所知 DatePicker不提供月份自定义字符串的机制 如果
  • QRect 的 qHash 函数

    计算的最佳方法是什么qHash的值QRect 我需要使用QRect 有可能QRectF 作为关键QCache 现在我正在使用这样的东西 inline uint qHash const QRect r return qHash QByteAr
  • $(document).ready(initialize) 和 $(document).on('ready',initialize) 有什么区别?

    有什么区别 document ready initialize and document on ready initialize 对我来说 它们似乎以同样的方式工作 document on ready initialize 如果执行文件时
  • 在jsp中使用另存为对话框下载文件...如何提示用户保存,查看取消对话框而不是直接打开图像

    我有一个jsp 其中我提供了一个用于下载任何文档的链接 每当用户单击链接时 都会直接打开文档 我想显示一个对话框 通常出现在许多网站上 它会要求用户保存 取消和查看文档 有人可以帮我吗 我在我的控制器类中使用以下代码 InputStream
  • 访问主程序子目录中的文件

    包含我的主要可执行文件的文件夹非常混乱 其中包含输入 输出和源文件 我想将其中一些文件移动到可执行文件的不同目录中 但仍然能够访问它们 例如 如果我可以制作一个目录 那就太好了 main outfile 它保存了我的程序的所有输出文件 在
  • OpenSSL ASN.1 编程教程

    我正在寻找有关使用 OpenSSL 库进行 ASN 1 DER 编码的任何 C C 教程 示例代码或文档 好吧 正如您在 openssl 网站上看到的那样 没有 ASN 1 函数的官方文档 但你总是可以下载 openssl 源 http o
  • Docker 不会在目录中搜索文件

    我创建了一个 docker 文件 FROM node 13 6 0 alpine3 10 WORKDIR src RUN apk add no cache bash COPY package json COPY package lock j
  • Marklogic Eclipse 设置

    我一直在尝试使用 marklogic 设置 eclipse 以将其用作我的 xquery 编辑器 我按照 Marklogic 关注此链接 http developer marklogic com learn xqdt setup http
  • Google Drive API Java 权限 500 内部错误

    我有下一个共享 Google Drive 文件的方法 public static boolean shareFile HttpServletRequest httpReq String fileId String user String r
  • setMultiChoiceItems 和 setMessage 在 AlertDialog 中不“工作”

    我很困惑为什么我的对话框无法正常工作 AlertDialog dialog final AlertDialog Builder builder new AlertDialog Builder this final CharSequence
  • 将“ngModelOptions”从自定义组件传递到包含的本机元素

    我有一个名为的自定义组件 Angular 6 ppo currency field使用以下模板 span class display formattedValue span
  • 带有文件扩展名的 ASP.NET MVC 路径

    在使用基于属性的路由的 ASP NET MVC5 中 我想处理带有文件扩展名的 URL 例如 javascript security js 下面是一个控制器操作方法示例 Route javascript security js public
  • 静态函数/变量

    我刚刚开始用 C 编程 这个静态变量 函数的概念对我来说并不清楚 为什么要使用它 还有其他替代方案吗 static 可能会有点令人困惑 因为它的含义根据使用位置的不同而略有不同 全局声明的静态变量仅在该源文件中可见 本地声明的静态变量将在对
  • 多个 Django 存储后端系统

    我有一个 django 应用程序 它使用 S3BotoStorage 后端在 Amazon s3 上存储上传的文件 但在 Web api 服务 使用 django tastypie 中 在 s3 上上传文件需要很长时间 因为有请求通过 We
  • C++ 中最短的程序

    我最近遇到了这段可以编译但运行时出现分段错误 g 的代码 这是来自 topcoder 的原始链接 include
  • PHP中如何获取一个句子的第一个单词?

    我想从字符串中提取变量的第一个单词 例如 采用以下输入 结果输出应该是Test 这是输入的第一个单词 我怎样才能做到这一点 有一个字符串函数 strtok http php net strtok 可用于将字符串拆分为更小的字符串 token
  • Javascript - 使用 forEach 向后循环数组

    有没有办法使用向后循环数组forEach 不是任何其他类型的循环 我知道如何使用 for 标准方式 并且没有实际反转数组本身 let arr 1 2 3 arr slice reverse forEach x gt console log
  • 如何避免 http://static.ak.facebook.com/connect/xd_arbiter.php 的链接无限期挂起[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我们在我们的网站上使用 Facebook 评论和 Facebook Like 按钮 这些以某种方式生成一个调用http
  • 在序列化器 django 中使用分页

    我正在开发一个 django 项目 在该项目中我试图获取所有具有update ts场大于product sync ts from Product一次从服务器获取表 但由于产品数量很大 这需要大量时间来获取所有数据 我还将当前时间戳与数据一起
  • 如何使用 IComparable 之类的方法自然地对 DataView 进行排序

    我的 DataView 表现得很有趣 它按字母顺序对事物进行排序 而我需要它按数字对事物进行排序 我在整个网络上查找了这个问题 发现了很多关于如何使用 ICompare 对其进行排序的想法 但没有什么真正可靠的 所以我的问题是 如何在 Da