首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C#排序和OrderBy比较

C#排序和OrderBy比较
EN

Stack Overflow用户
提问于 2009-12-02 20:45:00
回答 3查看 120.5K关注 0票数 124

我可以使用sort或OrderBy对列表进行排序。哪一个更快?两者都在使用相同的算法吗?

代码语言:javascript
复制
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.

代码语言:javascript
复制
persons.Sort((p1,p2)=>string.Compare(p1.Name,p2.Name,true));

2.

代码语言:javascript
复制
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);
    }
}
EN

回答 3

Stack Overflow用户

发布于 2012-02-06 14:25:38

Darin Dimitrov的回答表明,当面对已经排序的输入时,OrderByList.Sort稍微快一些。我修改了他的代码,使其重复对未排序的数据进行排序,并且OrderBy在大多数情况下会稍微慢一些。

此外,OrderBy测试使用ToArray强制枚举Linq枚举器,但这显然会返回一个与输入类型(Person[])不同的类型(List<Person>)。因此,我使用ToList而不是ToArray重新运行了测试,得到了更大的差异:

代码语言:javascript
复制
Sort: 25175ms
OrderBy: 30259ms
OrderByWithToList: 31458ms

代码:

代码语言:javascript
复制
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();
    }
}
票数 60
EN

Stack Overflow用户

发布于 2011-04-25 16:56:48

您应该计算OrderBy和Sort方法使用的算法的复杂度。据我所知,QuickSort的复杂度为n (log ),其中n是数组的长度。

我也搜索过orderby's,但即使在msdn库中也找不到任何信息。如果您没有与一个属性相关的任何相同的值和排序,我更喜欢使用Sort()方法;如果没有,则使用OrderBy。

票数 0
EN

Stack Overflow用户

发布于 2018-03-19 18:03:35

我只想补充一下,orderby更有用。

为什么?因为我可以这样做:

代码语言:javascript
复制
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)。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1832684

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档