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", "7"確認するため、2 の前に 12 を並べ替えます"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();

ただし、エントリが純粋に数値でない場合、2 行目は爆発します。より安全な方法は次のようになります。

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

ただし、数値を文字列として追加するという事実を考えると、数値が 2 桁以上になると正しい順序を取得できません。

例えば

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

「11」文字列の最初の文字「5」は最初の文字「1」よりも大きいため、「5」、「4」、「11」が返されます。このようにゼロの文字を追加するフォーマット指定子を使用して文字列を追加できます

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

出力が正しくソートされていること (4 桁以上の数字がない場合)

編集: List(Of String) の代わりに List(Of Integer) を使用し、結果をテキストボックスに入れる例

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 に答える