提问人:Darshak 提问时间:10/30/2023 最后编辑:Darshak 更新时间:10/30/2023 访问量:66
如何在jquery或.NET C中对数组进行排序#
How I can sort below Array in jquery or .NET C#
问:
如何使用 Year & Month 对“YearMonth”文本进行排序?
MyArray = ['2019APR', '2019AUG', '2019DEC', '2019FEB', '2019JAN',
'2019JUL', '2019JUN', '2019MAR', '2019MAY', '2019NOV', '2019OCT',
'2019SEP', '2020APR', '2020AUG', '2020DEC', '2020FEB', '2020JAN',
'2020JUL', '2020JUN', '2020MAR', '2020MAY', '2020NOV', '2020OCT', '2020SEP']
输出要求
['2019JAN', '2019FEB', '2019MAR', '2019APR', '2019MAY', '2019JUN',
'2019JUL', '2019AUG', '2019SEP', '2019OCT', '2019NOV', '2019DEC',
'2020JAN', '2020FEB', '2020MAR', '2020APR', '2020MAY', '2020JUN',
'2020JUL', '2020AUG', '2020SEP', '2020OCT', '2020NOV', '2020DEC']
我知道会按字母顺序对我的数组进行排序,但对此有任何最佳的自定义排序函数吗?Sort()
我得到了答案两个 答
JS 我发现自己是这样用的:- https://jsfiddle.net/51u9nb6c/2/
对于 .NET c#,我标记正确答案
答:
1赞
Zohar Peled
10/30/2023
#1
在 c# 中,可以使用 Array 的 Sort 重载,该重载将 Array 和 Comparison 作为参数:
var arr = new[] { "2019APR", "2019AUG", "2019DEC", "2019FEB",
"2019JAN", "2019JUL", "2019JUN", "2019MAR",
"2019MAY", "2019NOV", "2019OCT", "2019SEP",
"2020APR", "2020AUG", "2020DEC", "2020FEB",
"2020JAN", "2020JUL", "2020JUN", "2020MAR",
"2020MAY", "2020NOV", "2020OCT", "2020SEP" };
Array.Sort(arr, (a, b) => ConvertToDateTime(a).CompareTo(ConvertToDateTime(b)));
private DateTime ConvertToDateTime(string yyyyMMM)
=> DateTime.ParseExact(
yyyyMMM,
"yyyyMMM",
System.Globalization.CultureInfo.InvariantCulture);
注意:您不必使用该方法,它只是一个帮助程序,以避免两次编写完全相同的调用。ConvertToDateTime
ParseExact
在 SharpLab 上观看现场演示(没有帮助程序方法)
评论
0赞
Fildor
10/30/2023
如果是静态的,它会有所作为(例如在高性能场景中)吗?(我的 VS 建议这样做)ConvertToDateTime
1赞
Zohar Peled
10/30/2023
@Fildor我想它可能会对性能产生影响,但我严重怀疑这会成为真正的性能瓶颈。实际上,在写完这条评论后,我去检查并发现了一篇 Dev.To 帖子,声称静态方法比实例方法快 6 倍,所以如果它是正确的,它可能会产生比我想象的更显着的差异。
0赞
freedomn-m
10/30/2023
静态与实例:请参阅此问题(可能还有其他问题)(尽管似乎没有任何性能测试)
0赞
freedomn-m
10/30/2023
如果性能是一个问题,与其考虑 ConvertToDateTime 是否应该是静态的/不是静态的,那么最好不要使用任何 DateTime 函数 - 它们的速度是出了名的慢。这是一个方便的答案,而不是一个高性能的答案(不是说它会很慢,只是任何 DateTime 解析函数都会比简单的拆分 + 字典查找慢)(即手动编码自己解析性能)。
0赞
freedomn-m
10/30/2023
编辑它似乎是你的js解决方案所做的 - 你应该把它添加为自己的答案,因为jsfiddle链接将来可能会丢失。
1赞
jdweng
10/30/2023
#2
简单:
string[] MyArray = {"2019APR", "2019AUG", "2019DEC", "2019FEB", "2019JAN",
"2019JUL", "2019JUN", "2019MAR", "2019MAY", "2019NOV", "2019OCT",
"2019SEP", "2020APR", "2020AUG", "2020DEC", "2020FEB", "2020JAN",
"2020JUL", "2020JUN", "2020MAR", "2020MAY", "2020NOV", "2020OCT", "2020SEP" };
string[] sortedArray = MyArray.Select(x => new { s = x, date = DateTime.ParseExact(x, "yyyyMMM", System.Globalization.CultureInfo.InvariantCulture) })
.OrderBy(x => x.date)
.Select(x => x.s)
.ToArray();
评论
1赞
Zohar Peled
10/30/2023
请注意,这实际上不会对数组进行排序,而是返回一个新数组,根据 OP 请求进行排序。此外,您还将为数组中的每个项目创建一个新的匿名实例。总而言之,这不是解决问题的非常节省内存的方法,尽管公平地说,这是一个有效的解决方案,除非数组很长或这种类型发生很多次,否则它应该不是问题。
0赞
jdweng
10/30/2023
@ZoharPeled : 你的方法真的有什么不同吗?在您的解决方案中,在引擎盖下正在做什么并不明显。
0赞
Zohar Peled
10/30/2023
在内存使用方面,是的。我没有分配任何新的引用类型。在运行时性能方面 - 我相信如果有任何差异,可以忽略不计。
评论
DateTime.ParseExact("2019MAR", "yyyyMMM", System.Globalization.CultureInfo.InvariantCulture)
return a[1] - b[1] || months[a[0]] - months[b[0]];