【问题标题】:Sorting Numbers in a List/Textbox with additional Text使用附加文本对列表/文本框中的数字进行排序
【发布时间】:2018-05-08 20:34:32
【问题描述】:

我有带有(附加文本)的数字,我需要对数字进行排序(从小到大).. 我的代码看起来像;

decimal xy = Convert.ToDecimal(number);
decimal xy1 = Convert.ToDecimal(number1);
List<decimal> manynumbers = new List<decimal>();
manynumbers.Add(xy);
manynumbers.Add(xy1);
manynumbers.Sort();

然后我在我的文本框中用 foreach 写出排序后的数字

foreach (decimal z in manynumbers)
{
AppendTextBox2(Convert.ToString(z));
}

文本框看起来像;

1

2

AppendTextBox 的样子;

    public void AppendTextBox2(string value)
    {
        if (InvokeRequired)
        {
            this.Invoke(new Action<string>(AppendTextBox2), new object[] { value });
            return;
        }
        textBox15.Text += value + " \r\n";
    }

这很好用,但是当我在数字后面“添加”文本时,文本框中没有输出(没有错误..)

我试过了,但是没用……

decimal xy = Convert.ToDecimal(number + "TestXY");

【问题讨论】:

  • 您无法将包含租船人的字符串转换为十进制或任何其他表示数字的类型,您要在这里完成什么?
  • 所以如果你有 1TestXY、11TestXY 和 2TestXy,你希望它们的顺序是什么?
  • 等他说without a error
  • @ZohirSalakCeNa 我试图用数字(从大到小)对我的文本框(多行)和文本进行排序,比如说:453 JASD 和 9393 XY,排序 -> 9393 XY 和 453 JASD

标签: c#


【解决方案1】:

首先,我建议使用ListBoxTextBox 更好地显示列表。

根据您的回答,在我看来,您的数据是分开的,并且您将其组合成 1 个字符串以显示它。如果是这种情况,我建议使用一个包含 2 个字段的简单类(Item),这样可以更轻松地表示数据。

结合这两个建议,所有缺少的就是重写ToString() 方法,以允许List&lt;Item&gt; 按十进制字段排序并显示在ListBox 中,方法是将列表指定为数据源。带有 ListBox 的表单会显示如下数据:

public partial class Form1 : Form
{
    private class Item
    {
        public decimal fieldA = 0;
        public string fieldB = "";
        public override string ToString()
        {
            return $"{fieldA}{fieldB}";
        }
    }
    List<Item> items = new List<Item>()
    {
        new Item{fieldA = 3.8M,fieldB = "klsd"},
        new Item{fieldA = 84.6M,fieldB = "jio"},
        new Item{fieldA = 64.97M,fieldB = "gjidf"}
    };
    public Form1()
    {
        InitializeComponent();
        listBox1.DataSource = items.OrderBy(x => x.fieldA).ToList();
    }
}

要颠倒顺序,请使用items.OrderByDescending(x =&gt; x.fieldA).ToList()

【讨论】:

  • 哇,谢谢你的意见,这太有帮助了,谢谢:)
  • @Kabundscha - 不客气。我刚刚注意到您需要降序而不是升序。我为此添加了代码。
【解决方案2】:

由于您正在对包含数字的字符串进行排序,因此您可以使用 list&lt;string&gt; 并在其上调用 sort()

string xy = 4 + "TestXY";
string xy1 = 2 + "TestXY";

List<string> manynumbers = new List<string>();

manynumbers.Add(xy);
manynumbers.Add(xy1);
manynumbers.Sort();


foreach (string z in manynumbers)
{
    Console.WriteLine(z);
}

这样就出来了

2TestXY
4TestXY

编辑:在您的情况下,这应该很方便。

// Getting the input from multiline Textbox, splitting the content by a linebreak.
string[] input = textBox1.Text.Split(new string[] { "\n" }, StringSplitOptions.None);

// Since it's an array we can pass it as an argument to a list.
List<string> manynumbers = new List<string>(input);

// Then call sort()
manynumbers.Sort();

【讨论】:

    【解决方案3】:

    您不能将无效字符串转换为十进制。

    您可以改用字符串列表并对其进行排序而不转换为十进制,但这将导致字母数字排序。或者使用一些正则表达式删除附加文本。见Regex to get NUMBER only from String

    已编辑:

    您也可以创建自己的字符串比较器

     public class MyStringComparer : Comparer<string>, IComparer<string>
        {
            public override int Compare(string x, string y)
            {
                decimal dx = Convert.ToDecimal(Regex.Replace(x, @"[^\d]", ""));
                decimal dy = Convert.ToDecimal(Regex.Replace(y, @"[^\d]", ""));
                return Convert.ToInt32(dx - dy);
            }
        }
    

    然后在排序中使用

    List<string> manynumbers = new List<string>();
            manynumbers.Add("1.11 text");
            manynumbers.Add("1.1 text");
            manynumbers.Sort(new MyStringComparer());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-27
      相关资源
      最近更新 更多