Sort または OrderBy を使用してリストを並べ替えることができます。どちらが高速ですか? どちらも同じアルゴリズムで動作していますか?
List<Person> persons = new List<Person>();
persons.Add(new Person("P005", "Janson"));
persons.Add(new Person("P002", "Aravind"));
persons.Add(new Person("P007", "Kazhal"));
1.
persons.Sort((p1,p2)=>string.Compare(p1.Name,p2.Name,true));
2.
var query = persons.OrderBy(n => n.Name, new NameComparer());
class NameComparer : IComparer<string>
{
public int Compare(string x,string y)
{
return string.Compare(x, y, true);
}
}
ベストアンサー1
いいえ、同じアルゴリズムではありません。まず、LINQは次OrderBy
のように文書化されています。安定した(つまり、2 つの項目が同じ を持つ場合Name
、元の順序で表示されます)。
また、クエリをバッファリングするか、複数回反復するかによっても異なります (LINQ-to-Objects は、結果をバッファリングしない限り、 ごとに並べ替えますforeach
)。
クエリについてはOrderBy
、次のものも使用したいと思うでしょう:
OrderBy(n => n.Name, StringComparer.{yourchoice}IgnoreCase);
(、またはの{yourchoice}
いずれか)。CurrentCulture
Ordinal
InvariantCulture
このメソッドは、QuickSort アルゴリズムを使用する Array.Sort を使用します。この実装では不安定なソートが実行されます。つまり、2 つの要素が等しい場合、その順序は保持されない可能性があります。対照的に、安定したソートでは、等しい要素の順序が保持されます。
このメソッドは安定したソートを実行します。つまり、2 つの要素のキーが等しい場合、要素の順序は保持されます。対照的に、不安定なソートでは、同じキーを持つ要素の順序は保持されません。ソート。つまり、2 つの要素が等しい場合、その順序は保持されない可能性があります。対照的に、安定したソートでは、等しい要素の順序が保持されます。