如何按降序对文本文件中的不同类型数字排序到文本框?

Posted

技术标签:

【中文标题】如何按降序对文本文件中的不同类型数字排序到文本框?【英文标题】:How to sort different type numbers which with are in text file to textbox in descending? 【发布时间】:2020-01-14 19:55:49 【问题描述】:

它应该让我从我的计算机中选择一个文本文件。这个文本文件中会有数字。这些数字将由“空白”字符分隔(提示:确保考虑所有空白字符,否则您的程序可能会失败)。十进制数的小数位将用逗号分隔。文本文件中的数字数量不确定。当我选择文件并单击按钮时,我应该会看到文本文件中的所有数字按从大到小的顺序排序。

示例文本文件的内容如下所示:

56   45 6 2 789
9 349   -87
11
4,34   -198,456
65
9,85      45
-1
99,456
877 56     34  4

我在 Visual Studio 2017 上工作。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;

namespace TestUygulamasi 
    public partial class Form1 : Form 
        public Form1() 
            InitializeComponent();
        

        private void button1_Click(object sender, EventArgs e) //get file and paste to testbox
        
            Stream myStream = null;
            OpenFileDialog openFileDialog1 = new OpenFileDialog();
            openFileDialog1.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
            openFileDialog1.FilterIndex = 2;
            openFileDialog1.RestoreDirectory = true;

            if (openFileDialog1.ShowDialog() == DialogResult.OK) 
                try 
                    if ((myStream = openFileDialog1.OpenFile()) != null) 
                        using (myStream) 
                            textBox1.Text = File.ReadAllText(openFileDialog1.FileName);
                        
                    
                 catch (Exception ex) 
                    MessageBox.Show("Error: File has not read. Error: " + ex.Message);
                
            
        

        private void button2_Click(object sender, EventArgs e)//Sorting Button
        
            string numbers = textBox1.Text;
            string[] arr;
            arr = numbers.Split(' ');
            Array.Sort(arr);

            string sorting = int.Parse(textBox2.Text);
            for (int i = 0; i < arr.Length; ++i) 
                sorting = sorting + arr[i] + "\n";
                //sorting = arr[i] + "\n";
            

            textBox2.Text = Convert.ToString(sorting);
            //listBox1.Items.Add("\n" + sorting + "\n");
            //MessageBox.Show(sorting);
        
    

我无法对数字进行降序排序。

【问题讨论】:

是的,它们是数字。 "," 定义为十进制数。 99,456 低于 100。只是我需要删除空格并将它们放入数组中。然后我将它们降序排列。 【参考方案1】:

你可以使用 Linq。

var str = textBox1.Text;
var currentCulture = (CultureInfo)CultureInfo.InvariantCulture.Clone();
currentCulture.NumberFormat.NumberDecimalSeparator = ",";
currentCulture.NumberFormat.NumberGroupSeparator = ".";

var numbers = str.Split(new string[]  " ",Environment.NewLine ,StringSplitOptions.RemoveEmptyEntries)
                     .Select(num=> decimal.Parse(num,currentCulture))
                     .OrderBy(num=>num);
textBox1.Text = string.Join(Environment.NewLine,numbers);

【讨论】:

【参考方案2】:

另一个答案是这样。这段代码不是我写的。编写代码的人已经删除了代码和他/她的 cmets。他/她为什么这样做?我不知道。我希望他/她在这个问题下再次回答。我是该网站的新手,所以我无法投票赞成他/她的回答。谢谢我失去的秘密英雄。

        List<decimal> nums = new List<decimal>();
        for (int i = 0; i < textBox1.Lines.Count(); ++i)
        
            string[] line = textBox1.Lines[i].Split(new char[]  ' ' ,
                                                    StringSplitOptions.RemoveEmptyEntries);
            foreach (string s in line)
            
                nums.Add(decimal.Parse(s, NumberStyles.Number, new CultureInfo("tr-TR")));
            
        

        foreach (decimal d in nums.OrderByDescending(x => x))
        
            listBox1.Items.Add(d.ToString());
        

【讨论】:

以上是关于如何按降序对文本文件中的不同类型数字排序到文本框?的主要内容,如果未能解决你的问题,请参考以下文章

如何按降序对列表视图项进行排序

如何按降序对 ListView.builder 进行排序?

如何在Ruby中按降序对数组进行排序

如何按降序对 JSON 数组元素进行排序? [复制]

如何根据特定值按降序对数组进行排序[重复]

按降序对单链表进行排序