web-dev-qa-db-ja.com

OrderBy <>を使用してアイテムの配列を並べ替える

アイテムの配列があり、それらのプロパティの1つで並べ替えたいのですが。 "item.Fields [" FieldName "]。Value"を使用してitemsプロパティにアクセスできます。プロパティは文字列として返されますが、intにキャストできます。

OrderBy <>を確認しましたが、その使用方法がわかりません。

21
Zooking

明確にするために、OrderByは配列を所定の位置にソートしません-配列のソートされた新しいシーケンスcopyを返します。それが問題なければ、何かのようにします:

_var sorted = array.OrderBy(item => item.Fields["FieldName"].Value);
_

一方、プロパティが文字列として返されるが、intにキャストできるというコメントを理解できません。文字列をintにキャストすることはできません。解析する必要があります。それがあなたの意図したことなら、あなたはおそらく以下を望みます:

_var sorted = array.OrderBy(item => int.Parse(item.Fields["FieldName"].Value));
_

それを配列として必要な場合は、後でToArray()を呼び出すことができます。

_var sorted = array.OrderBy(item => int.Parse(item.Fields["FieldName"].Value))
                  .ToArray();
_

別の方法として、インプレースでソートする場合は_Array.Sort_を使用できますが、多少面倒になります。

44
Jon Skeet

Sortメソッドを使用して配列をソートします。

Array.Sort(theArray, (a, b) => String.Compare(a.Fields["FieldName"].Value, b.Fields["FieldName"].Value));

C#3を使用していない場合は、ラムダ式の代わりにデリゲートを使用します。

Array.Sort(theArray, delegate(Item a, Item b) { return String.Compare(a.Fields["FieldName"].Value, b.Fields["FieldName"].Value); } );

(これは、OrderBy拡張機能が機能しないフレームワーク2でも機能します。)

9
Guffa

Orderbyを使用できる場合は簡単ですが、以下を試してください。 int.Parseを投入しましたが、実際のソート方法によっては、これが不要になる場合があります。

var sorted = array.OrderBy(item => int.Parse(item.Fields["FieldName"].Value));
5
var sortedArray = items.OrderBy(i => i.property).ToArray();

配列が必要ない場合は、それをオフにしておくことができます。その場合は、item型のIEnumerable <>になります。

4
andleer

それは言及する価値があります List<T>.Sort はクイックソートに基づいており、ほとんどの場合、安定したソートではありません。

この実装は不安定なソートを実行します。つまり、2つの要素が等しい場合、それらの順序は保持されない可能性があります。対照的に、安定したソートでは、等しい要素の順序が保持されます。

ただし、 Enumberable.OrderBy 安定したソートを実行します。

このメソッドは安定したソートを実行します。つまり、2つの要素のキーが等しい場合、要素の順序は保持されます。対照的に、不安定なソートでは、同じキーを持つ要素の順序は保持されません。

0
Wenhan Kong