如何对表示数字(正数和负数以及小数部分)的字符串数组进行排序?

Posted

技术标签:

【中文标题】如何对表示数字(正数和负数以及小数部分)的字符串数组进行排序?【英文标题】:How to sort an array of string representing numbers (positive and negative as well as having a decimal part)? 【发布时间】:2021-04-18 18:49:36 【问题描述】:

使用 Windows 表单应用程序,我选择了一个带有随机数值的 txt 文件,我可以将它正确地打印在屏幕上。但是当我想对值进行排序时,“Array.Sort (values)”不起作用。我该如何处理?

按钮点击功能

private void button4_Click(object sender, EventArgs e)
    
        OpenFileDialog openFileDialog1 = new OpenFileDialog
        
            InitialDirectory = @"C:\",
            Title = "Title",
            CheckFileExists = true,
            CheckPathExists = true,
            DefaultExt = "txt",
            Filter = "txt (*.txt)|*.txt",
            FilterIndex = 2,
            RestoreDirectory = true,
            ReadOnlyChecked = true,
            ShowReadOnly = true
        ;
        if(openFileDialog1.ShowDialog()==DialogResult.OK)
        
            string path = openFileDialog1.FileName;
            string[] txtDoc = File.ReadAllLines(path);
            textBox6.Text = path;
            Array.Sort(txtDoc);
            foreach (string s in txtDoc)
            
                txtDoc = s.Split(new[]  " " , StringSplitOptions.RemoveEmptyEntries);
                foreach (string ss in txtDoc)
                
                    richTextBox1.Text +=ss+"\n";
                
            
        
    

输出

10
2
5
-4
12,37
2
69
45
-4,41
35
76
35
-45
6
10
5
4
12
78
25
1

示例文本

10 2 5   -4  

6 10    5    4 12   
35 -45
12,37


2 69 45   -4,41 
35  76
78  25    1 

【问题讨论】:

这能回答你的问题吗? Array.Sort for strings with numbers 和 How to sort a string array by numeric style? 你的排序不会是数字的,因为你是在一个字符串数组上执行它,而不是一个数字数组。 为什么最后有一个加号? richTextBox1.Text +=ss+ 另外,您的数组并不代表您想要的实际输出。为此,您必须先对数组执行 Split 操作,然后再执行排序。 @jdweng:他们正在连接一个换行符。 【参考方案1】:

您可以使用 LINQ 对数字进行排序并使用 double.TryParse 解析它们(您似乎使用逗号作为小数分隔符):

string[] sortedNumbers = txtDoc
    .SelectMany(line => line
        .Split(' ', StringSplitOptions.RemoveEmptyEntries)
        .Select(token => double.TryParse(token, out double value) ? value : (double?)null)
        .Where(nullableDouble => nullableDouble.HasValue)
        .Select(nullableDouble => nullableDouble.Value))
    .OrderBy(value => value)
    .Select(value => value.ToString())
    .ToArray();

【讨论】:

感谢您的帮助。但我这样更新它,因为它在第 3 行出现错误。Split(new[] " " , StringSplitOptions.RemoveEmptyEntries) @chapter: 好的,这也可以,但你注意到我使用char 而不是string 作为第一个参数? String.Split 的重载存在:docs.microsoft.com/en-us/dotnet/api/…【参考方案2】:

Array.Sort() 不工作,因为您尝试按string 排序,即尝试对文本文件中存在的行进行排序,而不是对该文件中存在的所有整数进行排序。

为了解决您的问题,

    您需要从文件中读取所有行,此步骤已在您的代码中完成。 以 分割每一行,然后将所有字符串转换为一个双精度数组。 然后按升序排序。 现在更新您的richTextBox1

string[] txtDoc = File.ReadAllLines(path);
var sortedList = new List<double>();
foreach(var line in txtDoc)

     var value = line.Split(new[]  " " , StringSplitOptions.RemoveEmptyEntries)
                       .Select(double.Parse)
                       .ToList()
     sortedList.AddRange(value);


sortedList.Sort();
richTextBox1.Text = string.Join(Environment.NewLine, sortedList);

【讨论】:

感谢您的帮助。你的代码工作正常,但我想你应该写 foreach 而不是 for :)【参考方案3】:

如果 txtDoc 是一个包含所有字符串的数组,您可以这样排序:

string[] orderedList = 
  txtDoc.OrderBy(x => new string(x.Where(char.IsNumber).ToArray())).ToArray();

【讨论】:

以上是关于如何对表示数字(正数和负数以及小数部分)的字符串数组进行排序?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用maskRe限制ExtJs Textfield仅接受数字。 (应接受正数,负数,整数和十进制数。)

0是整数吗,整数分几类,它们又是多少?

如何在Oracle数据库中保留小数点后两位 而且在java中保留两位插入到数据表中

如何在Oracle数据库中保留小数点后两位 而且在java中保留两位插入到数据表中

国庆随笔

Python流程图判断一个数是正数,负数还是0?