C#排序逗号分隔的数字字符串

4
在C#中,您认为最快的方法是什么?该代码最终将成为SQL Server CLR C#用户定义函数的一部分,但我认为这对于这个问题不重要。
INPUT:  "1,3,2,5,4"
OUTPUT: "1,2,3,4,5"

排序必须按照整型数字进行比较,而不是字符串或字符。

目前我的代码是这样的,但它是基于字符串而不是整型数字排序。我可以引入自定义比较器,但在这之前我想询问一下别人是否有任何想法。

[Microsoft.SqlServer.Server.SqlFunction]
public static SqlString udfSortDimensionValueIDString(SqlString DimensionValueIDs)
{
    string[] values = ((string)DimensionValueIDs).Split(',');
    Array.Sort(values);
    return String.Join(",", values);
}

如果这很重要的话,使用.NET 3.5。

2
这会给你字母排序,对吗?所以1、100和1000会排在2之前,对吗? - MatthewMartin
你的输入中有01怎么办?你的输出中是否也应该包含01,还是只需要1就可以了? - knittl
这就是为什么他说他想要整数排序,但目前只实现了字符串排序... 完全阅读问题有助于解决问题。 - Thorsten Dittmar
Array.Sort(values, new AlphanumComparatorFast()); - AbuQauod
代码最终将成为 SQL Server CLR C# 用户定义函数的一部分,但我认为这对于这个问题并不重要 - 如果用于开发“IN”子句,则排序可能会更快,因此解析可能是不必要的。 - D Stanley
显示剩余2条评论
3个回答

12

你可以使用Linq

  using System.Linq; // no include required, just uses the namespace

  ...

  String Input = "1,3,2,5,4";

  String Output = String.Join(",", Input
    .Split(',')
    .Select(x => int.Parse(x))
    .OrderBy(x => x));

在我的示例Web应用程序中,“Split”接受“char”而不是“string”。我需要知道什么吗? - Bharadwaj
我认为这个方案不会比原来的解决方案快多少。唯一的改进是数字排序,而瓶颈是字符串划分的内存分配。 - Nick
1
@Bharadwaj:对不起,我打错字了:Join需要String,而Split需要Char - Dmitry Bychenko
所以...有个愚蠢的问题。我是C#新手(更多使用Ruby和Javascript)...我该如何包含Linq DLL?我已经添加了对System.Data.Linq的引用,但是出现了“System.Array不包含Select的定义”错误。 - thomas
1
最终得到了以下结果。感谢!String.Join方法不喜欢尝试连接int[]而不是string[],所以我只是通过int.Parse(x)进行排序而不是选择它。return String.Join(",", ((string)DimensionValueIDs).Split(new char[] {','}, StringSplitOptions.RemoveEmptyEntries).Select(x => x).OrderBy(x => int.Parse(x)).ToArray()); - thomas
1
对于那些对性能提升感兴趣的人,我测试了这个新的CLR函数与TSQL等效函数进行比较(使用表函数将字符串拆分为行,排序,然后与for xml path连接)。在未排序的20万行CSV字符串上,CLR函数处理时间为4.174秒。而TSQL处理时间为190.197秒,时间减少了97.8%。(在Windows 2008服务器VM上运行的SQL Server 2008 R2,内存为8GB)。 - thomas

2
string s = "1,3,2,5,4";
string ordered = String.Join(",", s.Split(',').Select(c => Convert.ToInt32(c)).OrderBy(i=>i));

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接