列表按降序排序数字

时间:2013-07-25 15:23:09

标签: c# asp.net list

我有一个根本没有排序的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();
        }

4 个答案:

答案 0 :(得分:2)

您可以尝试使用

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”因为第一个字符“5”大于“11”字符串中的第一个字符“1”。 您可以添加一个格式说明符的字符串,将该字符添加为零,如此

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

并正确排序您的输出(除非您有4位数字以上的数字)

编辑:使用List(Of Integer)而不是List(Of String)并将结果放在文本框中的示例

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();

答案 1 :(得分:2)

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

这正是您在评论中提供的示例的问题。字符串排序比较第一个字符(数字)并看到1&lt; 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();

答案 2 :(得分:1)

使用

list.OrderByDescending

会有所帮助

答案 3 :(得分:0)

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