列を含む があり、 int を含むDataSet
と呼びます。Type
LINQ を使用して を操作してDataSet
おり、 で並べ替えたいと考えていますType
。現在、Type
列には 3 つの値 (1、2、3) しか含まれていません。Type
リストの最初に2があり、次に1と3になるようにソートしたいと思います。
これに対する簡単な解決策はありますか、それとも OrderBy をカスタマイズする必要がありますか?
いくつかの解決策:
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)であると主張します。
これは本当ですか、それは変わることができますか、私たちは知りません。
サンプルを簡単にするために、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) があります。ジョリーはもっと良い方法で処理できます。アイデアを提供するだけです。この時点で、アルゴリズムは汎用的であり、優先値に関するハードコーディングされたチェックは必要ありません (単にジョリー)。
潜在的な非効率性がいくつかありますが、このソリューションの一般的な考え方を示したかっただけです。
ここでは、これを達成するための 5 つの方法があります。これは、順序の最初に値を設定し、選択したものよりも低いものを投入{1 2 3 4 5 6}
し、選択したものよりも高いものを投入する方法に関する投稿です。 . ^_^{4 1 2 3 5 6}