我有一个int数组,我必须通过降序排序.
因为我没有找到任何方法来按降序对数组进行排序.目前我按降序对数组进行排序,如下所示
int[] array = new int[] { 3, 1, 4, 5, 2 };
Array.Sort<int>( array );
Array.Reverse( array );
Run Code Online (Sandbox Code Playgroud)
现在,问题是.在c#中有更好的方法吗?
显然LINQ的"OrderBy"最初被指定为不稳定,但到Orca时,它被指定为稳定.并非所有文档都已相应更新 - 请考虑以下链接:
但是,如果LINQ的OrderBy现在"稳定",那么这意味着它没有使用快速排序(这本质上是不稳定的),即使某些文档(例如Troy的书)说它是.所以我的问题是:如果不是快速排序,那么LINQ的orderBy使用的实际算法是什么?
我遇到了以下代码的意外问题.
List<string> items = new List<string>();
items = items.OrderBy(item => item);
Run Code Online (Sandbox Code Playgroud)
此代码生成错误:
无法将类型'System.Linq.IOrderedEnumerable'隐式转换为'System.Collections.Generic.List'.存在显式转换(您是否错过了演员?)
看来我可以改为items类型IEnumerable<string>,错误就消失了.但我需要能够将项目添加到列表中,这IEnumerable不支持.
有人可以帮我理解这个错误,最容易解决的是什么?简单地投射结果是否安全?
这是对C#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"));
Run Code Online (Sandbox Code Playgroud)
争论的方法是:
persons.Sort((p1, p2) => string.Compare(p1.Name, p2.Name, true));
//and
persons.OrderBy(n => n.Name);
Run Code Online (Sandbox Code Playgroud)
首先让我说,我理解没有任何重大的性能差异需要担心.但我很想知道为什么OrderBy表现得比这更好Sort.我正在使用@phoog在原始问题中发布的答案.
private void button1_Click(object sender, EventArgs e)
{
IEnumerable<Person> people;
BenchMark(persons => persons.Sort((p1, p2) => string.Compare(p1.Name, p2.Name, true)));
BenchMark(persons => people = persons.OrderBy(n => n.Name));
}
private static Random randomSeed = new Random();
public static string RandomString(int size, bool lowerCase)
{
var sb = new StringBuilder(size); …Run Code Online (Sandbox Code Playgroud) 我已经通过这篇文章 C#Sort和OrderBy比较
但是这个问题所接受的答案对我来说是模糊不清的.
我无法决定何时使用Sort或何时使用OrderBy.
反正是建议按彼此排序或排序.
所以,请给我一个简洁的答案,没有任何复杂性.
这是随机整数的枚举:
var r = new Random();
var e = Enumerable.Repeat(1, 10_000_000).Select( _ => r.Next());
Run Code Online (Sandbox Code Playgroud)
您认为哪个版本更快:
var result = e.OrderBy(x => x).Last(); //materialize the IEnumerable
Run Code Online (Sandbox Code Playgroud)
或者
var l = e.ToList();
l.Sort();
var result = l.Last();
Run Code Online (Sandbox Code Playgroud)
我希望.OrderBy(x => x).Last()在第一个示例中进行优化,只对列表的一小部分进行排序,或者只对列表进行 O(n) 遍历。
剧透: 事实并非如此。
但那么,两个版本的性能至少应该不相上下吧?我是说:
在第一个中,OrderBy()分配一个临时数组并就地对其进行排序。
在第二个中,我明确分配了一个列表并将Sort()其就位。
实际结果表明该OrderBy()示例慢了 4-5 倍!(5-6 秒 vs 1.2-1.3 秒)
任何人都可以解释为什么吗?
该.OrderBy(x => x)案例确实为每个元素执行其x => x身份 lambda。
和...之间的不同:
var result2 = e.Last();
Run Code Online (Sandbox Code Playgroud)
和
var result2 = e.Select(x=>x).Last(); …Run Code Online (Sandbox Code Playgroud) c# ×6
linq ×6
sorting ×6
collections ×2
.net ×1
algorithm ×1
ienumerable ×1
performance ×1
quicksort ×1