4

私の DataView はおかしな動作をしており、アルファベット順に並べ替えているため、数値的に並べ替える必要があります。私はこれについてウェブ全体を見渡し、ICompare で並べ替える方法について多くのアイデアを見つけましたが、実際には何もしっかりしていません。

だから私の質問は

  1. ICompare を DataView に実装するにはどうすればよいですか (ここでコードを探しています)。
  2. 実際の文字列である文字列でいっぱいの列と数字でいっぱいの列 (コンマ付き) から正しく解読する方法。

この 1 人で私を助けるコードが必要です。私は多かれ少なかれ ICompare のアイデアと、さまざまなシナリオで実装する方法について迷っているので、全体的に良い説明があれば素晴らしいでしょう。

また、リンクを渡さないでください。私はこれに関する確かな答えを探しています。

私が使用するいくつかのコード。

    DataView dataView = (DataView)Session["kingdomData"];
    dataView.Sort = e.SortExpression + " " + ConvertSortDirectionToSql(e.SortDirection);
    gvAllData.DataSource = dataView;
    gvAllData.DataBind();



    private string ConvertSortDirectionToSql(SortDirection sortDirection)
{
    string newSortDirection = String.Empty;
    if (Session["SortDirection"] == null)
    {
        switch (sortDirection)
        {
            case SortDirection.Ascending:
                newSortDirection = "ASC";
                break;
            case SortDirection.Descending:
                newSortDirection = "DESC";
                break;
        }
    }
    else
    {
        newSortDirection = Session["SortDirection"].ToString();
        switch (newSortDirection)
        {
            case "ASC":
                newSortDirection = "DESC";
                break;
            case "DESC":
                newSortDirection = "ASC";
                break;
        }
    }
    Session["SortDirection"] = newSortDirection;
    return newSortDirection;
}

このシナリオでは、データテーブルを動的に構築し、それをデータビューに押し込みます。そこで、データビューをグリッドビューに配置すると同時に、データビューをソート機能用のセッション オブジェクトに配置することも忘れないでください。

ユーザーがグリッドビューを呼び出して列を並べ替えると、セッション オブジェクトでデータビューを呼び出し、データビューの並べ替え式を次のように作成します。

dataview.sort = e.sortexpression + " " + e.Sortdirection; 

または、それらの線に沿った何か。したがって、通常出てくるものは、次のようなすべての実際の文字列に適しています

車; 家; スコット; ザックなど…

しかし、コンマ区切りの値を持つ数値フィールドに対して同じことを行うと、次のような結果になります

900; 800; 700; 600; 200; 120; 1,200; 12,340; 1,000,000;

私が何を意味するか分かりますか?ナチュラルソートではなく、アルファソートとしてアイテムをソートするだけです。Dataview を自然に数値列を次のように正しく並べ替えたい

120; 200; 600; 700; 800; 900; 1,200; 12,340; 1,000,000;

私を助けるためにあなたができることを教えてください。
PSこれを行う方法について数え切れないほどの記事を調べましたが、それらのすべてがリスト/配列に押し込んでそのように行うと言っていますが、もっと効率的な方法はありますか?

4

2 に答える 2

3

最初の問題 - IIRC では、比較子を使用して DataView を並べ替えることができません。フィールドを数値でソートする必要がある場合は、列のタイプが文字列ではなく数値であることを確認する必要があります。いくつかのコードは、これを解明するのに役立ちます。

2番目の問題についても、DataViewで直接行うことはできません。列内のデータの処理に基づいてレコードを並べ替える必要がある場合は、データを配列にコピーし、配列で IComparer を使用します。

DataView dv = new DataView(dt);
ArrayList lst = new ArrayList();
lst.AddRange(dv.Table.Rows);
lst.Sort(new MyComparer());
foreach (DataRow dr in lst)
    Debug.WriteLine(dr[0]);

比較子は次のようになります。

    class MyComparer : IComparer
    {
        public int Compare(object x, object y)
        {
            DataRow rx = x as DataRow;
            DataRow ry = y as DataRow;
            string datax = (string)rx[colName];
            string datay = (string)ry[colName];
            // Process datax and datay here then compare them (ASC)
            return datax.CompareTo(datay);
        }
    }

これによりメモリ消費量が増加するため、列で DataView を直接並べ替えることができるように、テーブル内のデータを前処理するためのより良い方法があるかどうかを考える必要があります。

PS colName は、並べ替えたい列の名前です。コメントを実際のコードに置き換えて、列から並べ替え情報を抽出します。このメソッドを使用して、より多くの列から並べ替え情報を抽出することもできます。次のようなものを使用してください:

int cmp = colAx.CompareTo(colAy);
if (cmp != 0)
    return cmp;
cmp = colBy.CompareTo(colBx);
return cmp;

これは、 colA 値の昇順を比較し、次に colB 値の降順を比較します (2 番目の比較では、最初にyがあり、次にxがあるわけではありません) 。

編集:OK、コンマ区切り値という用語を間違って解釈しました。あなたの例から、実際には千の区切り文字を含む数字を意味していたと思います(1,000,000 = 100万)。このような数値をデータベースに保存する場合は、テキスト フィールドを使用している必要があり、それが並べ替え順序が英数字である理由です。

この仮定に基づいて、その列のタイプを数値に変更し、通常の数値を内部に保持し、それらを表示するときにのみ(千の区切り記号を使用して)フォーマットすることを提案します。この方法では、並べ替えは DataView で直接機能し、データをコピーする必要はありません。

于 2008-09-18T06:26:48.687 に答える
1

醜いですが:

        DataView dv = GetDataViewSomewhere();

        //Naturally sort by COLUMN_TO_SORT_ON
        try
        {
            List<string> rowList = new List<string>();
            foreach (DataRowView drv in dv)
                rowList.Add((string)drv["COLUMN_TO_SORT_ON"]);
            rowList.Sort(new NaturalComparer());
            Dictionary<string, int> sortValueHash = new Dictionary<string, int>();
            for (int i = 0; i < rowList.Count; i++)
                sortValueHash.Add(rowList[i], i);                                    

            dv.Table.Columns.Add("NATURAL_SORT_ORDER", typeof(int));
            foreach (DataRowView drv in dv)
                drv["NATURAL_SORT_ORDER"] = sortValueHash[(string)drv["COLUMN_TO_SORT_ON"]];
            dv.Sort = "NATURAL_SORT_ORDER";                
        }
        catch (Exception)
        {                
            DEBUG_TRACE("Could not naturally sort");
            dv.Sort = "COLUMN_TO_SORT_ON";
        }

このクラスNaturalComparerはどこにありますか。

于 2009-10-28T23:41:03.210 に答える