1

列を含む があり、 int を含むDataSetと呼びます。TypeLINQ を使用して を操作してDataSetおり、 で並べ替えたいと考えていますType。現在、Type列には 3 つの値 (1、2、3) しか含まれていません。Typeリストの最初に2があり、次に1と3になるようにソートしたいと思います。

これに対する簡単な解決策はありますか、それとも OrderBy をカスタマイズする必要がありますか?

4

3 に答える 3

7

いくつかの解決策:

table.AsEnumerable()
.OrderBy(r => r.Field<int>("Type")==2 ? 0 : 1)
.ThenBy(r => r.Field<int>("Type"));

またはおそらくより良い

table.AsEnumerable().
OrderBy(r => r.Field<int>("Type")==2 
   ? 0 
   : r => r.Field<int>("Type"))

またはエレガントなティムシュメルターのソリューション

table.AsEnumerable()
.OrderByDescending(r => r.Field<int>("Type")==2)
.ThenBy(r => r.Field<int>("Type"))

アドバンテージまたはTimSchmelterのソリューション:「疑似値」に依存していません。

最初の2つのソリューションでは、0は((フィールドの可能な最小値)-1)であると主張します。

これは本当ですか、それは変わることができますか、私たちは知りません。

于 2012-09-26T15:05:01.287 に答える
0

サンプルを簡単にするために、DataTable から開始するという事実を削除しました。これは単なる詳細であり、これを行うことができると考えました。

var list = new [] { 1, 3, 5, 2, 4, 6, 9, 8 };
var sorters = new [] { 3, 2, -1 };

var o = from s in sorters
        from l in list.OrderBy(x => x)
        where s == l || (s == -1 && !sorters.Contains(l))
        select l;

ソート配列には、優先されるソーターが含まれています。このようにして、必要に応じて複数のソーターを使用できます。また、ソーターの終わりを表す「ジョリー」(-1) があります。ジョリーはもっと良い方法で処理できます。アイデアを提供するだけです。この時点で、アルゴリズムは汎用的であり、優先値に関するハードコーディングされたチェックは必要ありません (単にジョリー)。

潜在的な非効率性がいくつかありますが、このソリューションの一般的な考え方を示したかっただけです。

于 2012-09-26T15:45:11.563 に答える
0

ここでは、これを達成するための 5 つの方法があります。これは、順序の最初に値を設定し、選択したものよりも低いものを投入{1 2 3 4 5 6}し、選択したものよりも高いものを投入する方法に関する投稿です。 . ^_^{4 1 2 3 5 6}

https://stackoverflow.com/a/12580121/920359

于 2012-09-26T15:58:08.157 に答える