我有一个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();