2

クライアントブラウザから送信された並べ替えフィールドのコレクションに基づいて、データセットのカスタムフィルタリングと並べ替えを行っており、Dynamic Linqを使用して(ほとんどの)目的の効果を実現しています。問題が発生しているのは、従来の文字列と文字列として格納されている数値の両方を含むString型の列で並べ替えようとしたときです。StringComparison列挙値を渡したり、DynamicLinqorderby関数にIComparerパラメーターを指定したりできないようです。

私のソートコードは次のようになります:

myList.AsQueryable().OrderBy("StringColWithNums ASC")

私は最終的に:

1
10
100
11
12
2
20

それ以外の:

1
2
10
11
12
20
100

誰かが似たようなことをした経験はありますか?

4

4 に答える 4

1
myList.AsQueryable().Sort((r, s) => int.Parse(r).CompareTo(int.Parse(s)));

それらがオブジェクトである場合、単に使用する場合int.Parse(r.StringColWithNums)、またはフィールドが何であれ、微調整が必​​要になります。

おっと、申し訳ありませんが、すべてのOPを読んで、文字も含まれていることを確認していません。動的なlinq、編集が必要です。

編集

Dynamic linqを使用してIComparerを渡すことで、それができるようになるかどうかはわかりません。結果を取得した後でそれを実行できる場合があります(つまり、私が最初にソートを作成していたので、変更を加えました)。その行を追求したい場合はコメントしてください。

于 2010-12-06T18:30:26.847 に答える
0

これは、文字列比較内で数値比較を実行しようとする際の基本的な問題です。私がこれを行ういくつかの方法:

  • リストをロードするときは、最大文字列サイズに付随するゼロの量で数値にプレフィックスを付けますString.Format("000000", number)。これは、主に並べ替えに関心があり、結果の外観にはあまり関心がない場合にのみ機能します。その場合でも、「000010」を数値に変換し直してToString()メソッドを呼び出し、先行ゼロなしで数値を再度表示できます。

  • OrderByの独自の実装(拡張メソッド)を記述します。ここで、関数(または無名関数)をパラメーターとして渡して、渡されたメソッドを呼び出して結果を再ソートします。

于 2010-12-06T19:26:57.303 に答える
0

これは、新しい文字列比較プログラムを作成することで解決できます

 class AlphaNumericComparer : IComparer<string>
        {
            public int Compare(string x, string y)
            {
                // if both values are integers then do int comparision
                int xValue, yValue;
                if (int.TryParse(x, out xValue) && int.TryParse(y, out yValue))
                    return xValue.CompareTo(yValue);

                return x.CompareTo(y); // else do string comparison
            }
        }

次に、OrderByやSortなどのメソッドで比較子を使用できます

var sorted = lst.OrderBy(s => s, new AlphaNumericComparer());

lst.Sort(new AlphaNumericComparer());

これにより、望ましい結果が得られます。そうでない場合は、比較対象を微調整します。

于 2010-12-07T06:11:06.307 に答える
0

これは、少なくとも.NET 2.0 / 3.5では、DynamicLinqを使用してすぐに実行できるものではないようです。必要なことを実現するために、DynamicLinqソースコードを変更することになりました。

于 2010-12-08T04:10:40.563 に答える