我可以使用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);
}
}
发布于 2012-02-06 14:25:38
Darin Dimitrov的回答表明,当面对已经排序的输入时,OrderBy
比List.Sort
稍微快一些。我修改了他的代码,使其重复对未排序的数据进行排序,并且OrderBy
在大多数情况下会稍微慢一些。
此外,OrderBy
测试使用ToArray
强制枚举Linq枚举器,但这显然会返回一个与输入类型(Person[]
)不同的类型(List<Person>
)。因此,我使用ToList
而不是ToArray
重新运行了测试,得到了更大的差异:
Sort: 25175ms
OrderBy: 30259ms
OrderByWithToList: 31458ms
代码:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
class Program
{
class NameComparer : IComparer<string>
{
public int Compare(string x, string y)
{
return string.Compare(x, y, true);
}
}
class Person
{
public Person(string id, string name)
{
Id = id;
Name = name;
}
public string Id { get; set; }
public string Name { get; set; }
public override string ToString()
{
return Id + ": " + Name;
}
}
private static Random randomSeed = new Random();
public static string RandomString(int size, bool lowerCase)
{
var sb = new StringBuilder(size);
int start = (lowerCase) ? 97 : 65;
for (int i = 0; i < size; i++)
{
sb.Append((char)(26 * randomSeed.NextDouble() + start));
}
return sb.ToString();
}
private class PersonList : List<Person>
{
public PersonList(IEnumerable<Person> persons)
: base(persons)
{
}
public PersonList()
{
}
public override string ToString()
{
var names = Math.Min(Count, 5);
var builder = new StringBuilder();
for (var i = 0; i < names; i++)
builder.Append(this[i]).Append(", ");
return builder.ToString();
}
}
static void Main()
{
var persons = new PersonList();
for (int i = 0; i < 100000; i++)
{
persons.Add(new Person("P" + i.ToString(), RandomString(5, true)));
}
var unsortedPersons = new PersonList(persons);
const int COUNT = 30;
Stopwatch watch = new Stopwatch();
for (int i = 0; i < COUNT; i++)
{
watch.Start();
Sort(persons);
watch.Stop();
persons.Clear();
persons.AddRange(unsortedPersons);
}
Console.WriteLine("Sort: {0}ms", watch.ElapsedMilliseconds);
watch = new Stopwatch();
for (int i = 0; i < COUNT; i++)
{
watch.Start();
OrderBy(persons);
watch.Stop();
persons.Clear();
persons.AddRange(unsortedPersons);
}
Console.WriteLine("OrderBy: {0}ms", watch.ElapsedMilliseconds);
watch = new Stopwatch();
for (int i = 0; i < COUNT; i++)
{
watch.Start();
OrderByWithToList(persons);
watch.Stop();
persons.Clear();
persons.AddRange(unsortedPersons);
}
Console.WriteLine("OrderByWithToList: {0}ms", watch.ElapsedMilliseconds);
}
static void Sort(List<Person> list)
{
list.Sort((p1, p2) => string.Compare(p1.Name, p2.Name, true));
}
static void OrderBy(List<Person> list)
{
var result = list.OrderBy(n => n.Name, new NameComparer()).ToArray();
}
static void OrderByWithToList(List<Person> list)
{
var result = list.OrderBy(n => n.Name, new NameComparer()).ToList();
}
}
发布于 2011-04-25 16:56:48
您应该计算OrderBy和Sort方法使用的算法的复杂度。据我所知,QuickSort的复杂度为n (log ),其中n是数组的长度。
我也搜索过orderby's,但即使在msdn库中也找不到任何信息。如果您没有与一个属性相关的任何相同的值和排序,我更喜欢使用Sort()方法;如果没有,则使用OrderBy。
发布于 2018-03-19 18:03:35
我只想补充一下,orderby更有用。
为什么?因为我可以这样做:
Dim thisAccountBalances = account.DictOfBalances.Values.ToList
thisAccountBalances.ForEach(Sub(x) x.computeBalanceOtherFactors())
thisAccountBalances=thisAccountBalances.OrderBy(Function(x) x.TotalBalance).tolist
listOfBalances.AddRange(thisAccountBalances)
为什么是复杂的比较器?只需基于字段进行排序。这里我基于TotalBalance进行排序。
非常简单。
我不能用sort做到这一点。我想知道为什么。使用orderBy做得很好。
至于速度,它总是O(n)。
https://stackoverflow.com/questions/1832684
复制相似问题