【字符串排序】C#和前端js排序问题

news/2025/1/8 21:13:35/文章来源:https://www.cnblogs.com/masonblog/p/18660543

前言

前端请求时做了个参数验证,就是简单的计算md5,但是与后端计算的结果始终不一致

发现是前后端对字符串排序的默认规则有区别

测试代码

前端

1、示例代码,可以在浏览器的控制台中直接运行

e=["","","1","a","d","B","你好","你0","你d","你A",",","你."]
e.sort((a, b) => (a > b ? 1 : a < b ? -1 : 0));
console.log(e);

2、运行结果

['', ',', '1', 'B', 'a', 'd', '你', '你.', '你0', '你A', '你d', '你好']


后端

1、示例代码

var arr = new string[] { "", "", "1", "a", "d", "B", "你好", "你0", "你d", "你A", ",", "你." };
var r = "'" + string.Join("', '", arr.OrderBy(x => x)) + "'";
Console.WriteLine(r);

2、运行结果

'', ',', '1', '你', '你.', '你0', '你好', '你A', '你d', 'a', 'B', 'd'

 

分析规则

前端:

空 -> 标点符号 -> 数字 -> 大写字母 -> 小写字母 -> 汉字

后端:

空 -> 标点符号 -> 数字 -> 汉字 -> 字母(不区分大小写)

解决方案

方案1-自定义字符串对比规则

private static void SortByCompare(string[] arr)
{var r = string.Join(" ", arr.OrderBy(x => x, new StringComparer()));Console.WriteLine(r);
}
public class StringComparer : IComparer<string>
{public int Compare(string x, string y){int orderX = 0;int orderY = 0;if (!string.IsNullOrWhiteSpace(x))orderX = GetOrder(x[0]);if (!string.IsNullOrWhiteSpace(y))orderY = GetOrder(y[0]);if (orderX == orderY)return string.Compare(x, y, StringComparison.Ordinal);return orderX.CompareTo(orderY);}private int GetOrder(char c){if (char.IsPunctuation(c))return 10;if (char.IsDigit(c))return 20;else if (char.IsUpper(c))return 30;else if (char.IsLower(c))return 40;return 999;}
}

方案2-使用V8引擎调用js方法

1、项目添加以下Nuget引用

Microsoft.ClearScript.Core

Microsoft.ClearScript.V8

Microsoft.ClearScript.V8.Native.win-x64

2、项目添加js文件,示例:calc.js,内容如下

function sortParameter(data) {if (!data) {return "";}var e = JSON.parse(data);e.sort((a, b) => (a > b ? 1 : a < b ? -1 : 0));return e.join(" ");
}

 

 3、编写方法

private static V8ScriptEngine _engine = new();
private static void SortByV8(string[] arr)
{_engine.Execute(File.ReadAllText(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "calc.js"), Encoding.UTF8));string json = arr.ToJson();object r = _engine.Invoke("sortParameter", [json]);Console.WriteLine(r);
}

验证

1、后端代码

var arr = new string[] { "", "123", "all", "delay", "Basic", ",./" };SortByCompare(arr);
SortByV8(arr);

 

2、后端运行结果

 ,./ 123 Basic all delay
 ,./ 123 Basic all delay

3、前端代码

e=["", "123", "all", "delay", "Basic", ",./"]
e.sort((a, b) => (a > b ? 1 : a < b ? -1 : 0));
console.log(e);

 

4、前端运行结果

['', ',./', '123', 'Basic', 'all', 'delay']

总结

按照这个场景,这2个方案都能实现,但也各有优劣。

方案1-自定义规则,

(1)是C#语言的实现,

(2)但只处理了首个字符的逻辑处理

(3)且未处理汉字的逻辑

方案2-V8引擎调用js

(1)比较重,单独引用了类库

(2)无须重新实现逻辑了,直接执行js的逻辑

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/866075.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# 调用YoloSharp.Gpu,调用Microsoft.ML.OnnxRuntime.Gpu出错126

今天使用C#调用YoloSharp.Gpu,加载onnx模型,然后检测,代码很简单。 // Load the YOLO predictor predictor ??= new YoloPredictor(@"path to your.onnx");// Run model var result = predictor.Detect(@"path to your image");一运行就爆错ONNXRunti…

charls 安卓apk抓包证书配置

一:证书制作 将证书保存到本地:charles.pem OpenSSL签发证书制作: 安装openssl方法 打开网址,https://slproweb.com/products/Win32OpenSSL.html openssl x509 -subject_hash_old -in d:\CA\charles.pem修改文件 2bd25718.0(后缀名为0)二:证书导入 模拟器设置可写入 …

第十九次作业

1、安装fortify并以pikachu靶场为目标进行练习熟练使用fortify 安装安装后复制fortify-common-23.2.0.0023: 将fortify-common-23.2.0.0023.jar⽂件分别将下⾯路径的⽂件覆盖 C:\Program Files\Fortify\Fortify_Apps_and_Tools_23.2.0\Core\lib C:\Program Files\Fortify\Fort…

mongodb windows zip安装并服务自启动

1.下载并解压。2.新建文件/文件夹 data/db 目录 logs/mongod.log 文件 conf/mongod.conf 文件 3.编辑conf/mongod.conf文件 systemLog:destination: filelogAppend: truepath: F:/mongodb-win32-x86_64-windows-6.0.20-rc3/logs/mongod.logstorage:dbPath: F:/mongodb-win32-x…

Linux通过端口找到对应的服务

首先执行netstat -tulnp | grep <端口号>例如:netstat -tulnp | grep :80参数解释:-t: 显示 TCP 连接(只显示TCP协议的端口信息)。 -u: 显示 UDP 连接(只显示UDP协议的端口信息)。 -l: 显示正在监听(Listening)状态的端口(只显示处于监听状态的端口)。 -n: 以数…

2025新春源码免费送

我们常常在日常生活中感到时间过得异常缓慢,仿佛未来遥不可及。然而,当我们回过头去审视过去,才发现时间早已悄然溜走,许多曾经等待的日子已经过去。时间总是在不经意间流逝,让人意识到它的宝贵和不可逆转。 尽管如此,我们依然应对未来保持从容的态度。生活充满了无数的可…

2025.1.8 鲜花

Nim 的变种Nim 的变种グランドエスケープ 空飛ぶ羽根と引き換えに 繋ぎ合う手を選んだ僕ら 没有选择飞翔的翅膀 而是选择十指相扣的我们 それでも空に魅せられて 夢を重ねるのは罪か 却仍然向往着天空 反复做着同样的梦 这有错吗 夏は秋の背中を見て その顔を思い浮かべる 夏…

CTF 之 Crypto (Cryptography) 学习笔记

CTF 之 Crypto (Cryptography) Chapter 0. 前置知识 群 (Group) 给定一个集合 \(G\neq \emptyset\) 以及二元代数运算 \(\circ\),若满足:封闭性 (Closure):\(\forall u,v\in G\),\(u\circ v\in G\); 结合律 (Associativity):\(\forall u,v,w\in G\),\((u\circ v)\circ w…

(2025自测有效!)全网最好的python配置教程【非常非常适合小白】

前几天我的电脑刚刚重装,把python重新配置了一下。 1.Python环境部署Python3 可应用于多平台包括 Windows、Linux 和 Mac OS X。 Python官网:https://www.python.org/ 进入官网在导航栏选择Dowmloads,选择所使用的系统(以Windows为例) 进入Windows下载页之后选择需要下载的…

写一个支持折叠、有缩进、代码高亮、离线的,方便部署的、易用的、优雅的json格式化查看工具(附html完整代码)

缘由 网上的在线json格式化有很多,但我是个有追求的人。在线的很难同时支持折叠、有缩进线、代码高亮、离线的,方便部署的、易用的、不请求后端(为了安全)的json格式化工具。 去Github上找项目,华而不实的东西占半个屏幕,格式化json要点好几下,一个json格式化工具npm安装…

AGC041F Histogram Rooks

我不知道啊,我只是觉得容斥很好玩。一个朴素的想法是容斥:考虑钦定 \(S\) 集合的位置没有被车覆盖,则答案是 \((-1)^{|S|}2^{c}\),其中 \(c\) 是可以放车的位置,可以直接 dp 做到 \(\mathrm{O}(2^n \text{poly}(n))\),但是难以优化。 延续容斥的想法,注意到钦定一个位置…