0

我有一个根本没有排序的列表。我使用了 .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

4 回答 4

3

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

这正是您在评论中提供的示例的问题。字符串排序比较第一个字符(数字)并看到 1 < 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();
于 2013-07-25T15:30:52.607 回答
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();
于 2013-07-25T15:26:15.607 回答
1

使用

list.OrderByDescending

有助于

于 2013-07-25T15:27:35.967 回答
0
var names = new List<string> { "abc", "xyz" };
var srotedDesc = names.OrderByDescending(x => x).ToList();
于 2017-02-28T17:55:42.810 回答