按降序列出排序编号



我有一个List根本没有排序。我使用了.Sort,但不起作用。我希望这些数字按降序排序。9、6、4、3、2

 List<string> tem = new List<string>();
 using (SqlConnection cs = new SqlConnection(connStr))
 {
       cs.Open();
       for (int x = 0; x < length; x++)
       {
           SqlCommand select = new SqlCommand("spTicketIssuance_GetTransactions", cs);
                select.CommandType = System.Data.CommandType.StoredProcedure;
                select.Parameters.AddWithValue("@TransDesc", TransType[x]);
            SqlDataReader dr = select.ExecuteReader();
            while (dr.Read())
            {
                tem.Add(dr["TransTime"].ToString()); //Adds all Transaction in the multiline textbox and adds them to List  TransList
            }
            dr.Close();
       }
            tem.Sort(); //NOT SORTING
            cs.Close();
        }

您说您在对数字进行排序,但您的列表中包含字符串。如果数字的位数不同,对字符串中的数值进行排序会导致各种奇怪的结果。

这正是你在评论中给出的样本的问题所在。字符串排序比较第一个字符(数字);2,所以它在2之前对12进行排序。如果你从"2", "12", "7"开始,你会看到它产生同样的结果——"12", "2", "7"

如果要存储数值,请为列表使用数字类型。

此外,Sort()将始终按升序排序。如果你想让它产生一个递减的结果,你需要Reverse()这个结果,或者,正如其他答案所说,使用OrderByDescending(x => x)而不是Sort()。后一种选择会更有效率。

更新

我从你对@Steve的回答的评论中得出结论,数据库中的数据类型也是字符类型?

对于您的文本框,您可以执行以下操作:

string[] lines = text.Split(Environment.NewLine, StringSplitOptions.RemoveEmptyEntries);
List<int> trans = lines.Select(line => Int32.Parse(line)).ToList();

不过,如果条目不是纯数字的,第二行就会爆炸。更安全的方法是这样的:

IEnumerable<int?> values = lines.Select(line => 
{
    int value; 
    return Int32.TryParse(line, out value) ? (int?)value : null;
})
List<int> trans = values.Where(v => v.HasValue).Select(v => v.Value).ToList();

这将丢弃任何无法转换为int的行。

一旦你得到了数字格式的数据,然后用这种方式将其存储在数据库中,剩下的处理(排序等)就会变得容易得多。

更新2

正如我在评论中所说,OrderByDescending()方法不会更改它所应用的列表,但本质上在该列表上提供了不同的枚举顺序。如果您需要列表中的结果,只需添加ToList()即可。因此:

List<int> sortedTrans = transInt.OrderByDescending(x => x).ToList();

您可以尝试

var ordered = tem.OrderByDescending(x => x);

然而,考虑到将数字添加为字符串的事实,如果数字是两位数或两位数以上,则无法获得正确的顺序。

例如

List<string> tem = new List<string>() {"11", "5", "4"};
var ordered = tem.OrderByDescending(x => x);
foreach(string s in ordered)
     Console.WriteLine(s);

会给你"5"、"4"、"11",因为"11"字符串中的第一个字符"5"大于第一个字符"1"。您可以添加带有格式说明符的字符串,该格式说明符可以像下面的一样添加零字符

tem.Add(string.Format("{0:D3}", dr["TransTime"])); 

并对您的输出进行正确排序(除非您的数字为4位数或更多)

编辑:使用列表(整数)而不是列表(字符串)并将结果放入文本框的示例

List<int> tem = new List<int>();
using (SqlConnection cs = new SqlConnection(connStr))
{
    .....
    tem.Add(Convert.ToInt32(dr["TransTime"])); 
}
var ordered = tem.OrderByDescending(x => x).ToList();
StringBuilder sb = new StringBuilder();
ordered.ForEach(x => sb.AppendLine(x.ToString()));
textBox.Text = sb.ToString();

使用

list.OrderByDescending

将有助于

var names = new List<string> { "abc", "xyz" };
var srotedDesc = names.OrderByDescending(x => x).ToList();

最新更新