Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何对数据表的字符串数字列进行正确排序_C#_Regex_Linq_Sorting_Icomparer - Fatal编程技术网

C# 如何对数据表的字符串数字列进行正确排序

C# 如何对数据表的字符串数字列进行正确排序,c#,regex,linq,sorting,icomparer,C#,Regex,Linq,Sorting,Icomparer,我尝试对字符串编号列进行排序,例如N1、N10、N100、N2,我希望得到结果N1、N2、N10、N100,但排序不起作用,我得到的值N1、N10、N100、N2的顺序相同 我编写了以下代码 static class ExtensionMethod { public static DataTable SortAlphaNumeric(this DataTable datatable, string columnName) { return datatable.As

我尝试对字符串编号列进行排序,例如N1、N10、N100、N2,我希望得到结果N1、N2、N10、N100,但排序不起作用,我得到的值N1、N10、N100、N2的顺序相同

我编写了以下代码

static class ExtensionMethod
{
    public static DataTable SortAlphaNumeric(this DataTable datatable, string columnName)
    {
        return datatable.AsEnumerable()
                  .OrderBy(r => r.Field<String>(columnName), new CustomComparer())
                  .CopyToDataTable();
    }
}

public class CustomComparer : IComparer<string>
{
    public int Compare(string x, string y)
    {
        var numberX = Regex.Match(x, @"\d+").Value;
        var numberY = Regex.Match(y, @"\d+").Value;

        var alphaX = Regex.Match(x, @"[^a-z]").Value;
        var alphaY = Regex.Match(y, @"[^a-z]").Value;

        if (alphaX.CompareTo(alphaY) == 0)
            return numberX.CompareTo(numberY);
        else if (alphaX.CompareTo(alphaY) < 0)
            return -1;
        return 1;            
    }
}

// Code example
class TestExample
{
    public void Test()
    {
        var dt = new DataTable();
        dt.Columns.Add("AlphaNumeric", Type.GetType("System.String"));
        var row = dt.NewRow();
        row["AlphaNumeric"] = "N1";
        dt.Rows.Add(row);
        row = dt.NewRow();
        row["AlphaNumeric"] = "N10";
        dt.Rows.Add(row);
        row = dt.NewRow();
        row["AlphaNumeric"] = "N100";
        dt.Rows.Add(row);
        row = dt.NewRow();
        row["AlphaNumeric"] = "N2";
        dt.Rows.Add(row);

        var orderedDt = dt.SortAlphaNumeric("AlphaNumeric");
    }
}
静态类扩展方法
{
公共静态数据表SortAlphaNumeric(此数据表,字符串列名称)
{
返回datatable.AsEnumerable()
.OrderBy(r=>r.Field(columnName),新的CustomComparer()
.CopyToDataTable();
}
}
公共类CustomComparer:IComparer
{
公共整数比较(字符串x、字符串y)
{
var numberX=Regex.Match(x,@“\d+”).Value;
var numberY=Regex.Match(y,@“\d+”).Value;
var alphaX=Regex.Match(x,@“[^a-z]”)。值;
var alphaY=Regex.Match(y,@“[^a-z]”)。值;
if(alphaX.CompareTo(alphaY)==0)
返回编号x.CompareTo(编号);
else if(alphaX.CompareTo(alphaY)<0)
返回-1;
返回1;
}
}
//代码示例
类测试示例
{
公开无效测试()
{
var dt=新数据表();
Add(“字母数字”,Type.GetType(“System.String”);
var row=dt.NewRow();
行[“字母数字”]=“N1”;
dt.行。添加(行);
row=dt.NewRow();
行[“字母数字”]=“N10”;
dt.行。添加(行);
row=dt.NewRow();
行[“字母数字”]=“N100”;
dt.行。添加(行);
row=dt.NewRow();
行[“字母数字”]=“N2”;
dt.行。添加(行);
var orderedDt=dt.SortAlphaNumeric(“字母数字”);
}
}
我会使用
(?[A-Za-z])(?\d+
作为正则表达式,比较
alpha
(字符串比较),然后,如果相等,
int.Parse
解析
数字
并比较(整数比较)


这样只会执行两次正则表达式,而不是四次(可能编译正则表达式并将其放在静态字段中也会使其更快),如果比较实际数字,
2
将小于
10
。如果不分析数字,可以跳过整个正则表达式,只进行一个字符串比较。

比较器中的更改:

var numberX = int.Parse(Regex.Match(x, @"\d+").Value);
var numberY = int.Parse(Regex.Match(y, @"\d+").Value);

如果数字sheme是确定性的(总是一个字符串+一个整数),您可以简单地将它们存储在两个单独的字段中(理想情况下返回到DB中。组合键毕竟是一件事)。然后是“先按字符串排序,再按数字排序”


如果不是这样,事情就会变得艰难。您需要的是Windows对文件进行的非常不寻常的排序。除了自定义正则表达式解决方案外(但如果是确定性的,您可以使用2个或更多字段),还有其他解决方案。但是,这一个是非托管的,并且它的行为在窗口之间存在差异(这是它运行的窗口的“规范”排序,但在Windows版本之间存在差异)。

alpha
不是a-z?我的意思是alpha是所有字母a-z和a-z。是不是编错了?@AntonínLejsek,接得好,我搞定了。我刚把错误的代码复制到问题上。感谢SBTB,它是否必须支持旧ASCII范围之外的Unicode字符?我这样问是因为对这些字符串进行排序有一个特殊的问题,即归一化()如果这足够好,但是如果您有其他字符串,比如
C99
或者甚至
X10a
,您需要一个更复杂的比较器,它可以将部分解析为int,但也可以比较其他部分。是的,没错。在本例中,已经比较了第一个字母。