如何在jquery或.NET C中对数组进行排序#

How I can sort below Array in jquery or .NET C#

提问人:Darshak 提问时间:10/30/2023 最后编辑:Darshak 更新时间:10/30/2023 访问量:66

问:

如何使用 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#,我标记正确答案

C# jQuery

评论

0赞 JayV 10/30/2023
这是一个很好的起点:google.co.uk/search?q=jquery+sort+array
0赞 Good Night Nerd Pride 10/30/2023
您将需要一个接受自定义比较函数的排序函数。此函数应将日期字符串拆分为其组件。年份可以转换为数字并按原样使用。如果两个比较日期的年份相同,则该函数应查看月份字符串。您可以使用预定义的映射/字典来获取两个月的数值,然后进行比较。
3赞 Good Night Nerd Pride 10/30/2023
如果您使用的是 C#,您还可以解析日期并直接对它们进行排序,而无需自定义比较函数。我不知道JS是否支持这样的日期解析。DateTime.ParseExact("2019MAR", "yyyyMMM", System.Globalization.CultureInfo.InvariantCulture)
0赞 gunr2171 10/30/2023
请选择 JavaScript 或 C# 进行实现。
0赞 Good Night Nerd Pride 10/30/2023
你的JS解决方案看起来不错,但可以简化一点:return a[1] - b[1] || months[a[0]] - months[b[0]];

答:

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);

注意:您不必使用该方法,它只是一个帮助程序,以避免两次编写完全相同的调用。ConvertToDateTimeParseExact

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
在内存使用方面,是的。我没有分配任何新的引用类型。在运行时性能方面 - 我相信如果有任何差异,可以忽略不计。