如何对表示数字(正数和负数以及小数部分)的字符串数组进行排序?
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仅接受数字。 (应接受正数,负数,整数和十进制数。)
如何在Oracle数据库中保留小数点后两位 而且在java中保留两位插入到数据表中