📜  orderby c# randomize - C# (1)

📅  最后修改于: 2023-12-03 15:18:10.361000             🧑  作者: Mango

C#中的orderby和随机排序

简介

C#中的orderby用于对数据按照指定的排序规则进行排序。默认情况下,orderby按照升序排序。如果需要按照降序排序,则需要使用关键字descending。此外,orderby也支持对多个属性进行排序。

对于需要进行随机排序的情况,C#中也提供了相应的解决方案。本文将介绍C#中的orderby以及如何进行随机排序。

orderby

在C#中,orderby可用于对IEnumerable集合中的元素进行排序。下面是一个简单的示例:

var numbers = new[] { 5, 2, 8, 1, 6 };

var sortedNumbers = from n in numbers
                    orderby n
                    select n;

foreach (var n in sortedNumbers)
{
    Console.WriteLine(n);
}

该示例中,numbers数组中的元素按照升序排列。orderby关键字后的变量n表示需要排序的属性名,其后可带有可选的descending关键字。

如果需要对多个属性进行排序,可以使用多个orderby关键字。以下是一个示例:

class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Age { get; set; }
}

var people = new[]
{
    new Person { FirstName = "John", LastName = "Doe", Age = 30 },
    new Person { FirstName = "Jane", LastName = "Doe", Age = 25 },
    new Person { FirstName = "Bob", LastName = "Smith", Age = 50 },
};

var sortedPeople = from p in people
                   orderby p.LastName ascending, p.FirstName ascending
                   select p;

foreach (var p in sortedPeople)
{
    Console.WriteLine("{0} {1}, {2}", p.FirstName, p.LastName, p.Age);
}

该示例中,sortedPeople集合中的元素首先按照LastName进行升序排序,如果LastName相同,则按照FirstName进行升序排序。最终的排序结果如下:

John Doe, 30
Jane Doe, 25
Bob Smith, 50
随机排序

如果需要对集合进行随机排序,C#中也提供了相应的解决方案。下面是一个示例:

var people = new[]
{
    new { Name = "John", Age = 30 },
    new { Name = "Jane", Age = 25 },
    new { Name = "Bob", Age = 50 },
};

var randomPeople = from p in people
                   orderby Guid.NewGuid()
                   select p;

foreach (var p in randomPeople)
{
    Console.WriteLine("{0}, {1}", p.Name, p.Age);
}

该示例中,guid.NewGuid()返回一个全局唯一的标识符。对所有元素都调用该方法后,将生成一个随机的集合。

需要注意的是,本示例只适用于小型集合。对于较大的集合,采用该方法会影响性能。较好的方式是将所有元素存储到一个List中,然后使用洗牌算法对其进行随机排序。

public static void Shuffle<T>(List<T> list)
{
    var rng = new Random();
    int n = list.Count;
    while (n > 1)
    {
        n--;
        int k = rng.Next(n + 1);
        T value = list[k];
        list[k] = list[n];
        list[n] = value;
    }
}

上述代码中,Shuffle方法将随机打乱一个List集合中的元素。

结论

C#中的orderby可用于对集合中的元素进行排序。默认情况下按照升序排序。如果需要按照降序排序,则需要使用关键字descendingorderby也支持对多个属性进行排序。

对于需要进行随机排序的情况,可以使用guid.NewGuid()方法或者洗牌算法。但是需要注意,对于较小的集合可以采用guid.NewGuid()方法,对于较大的集合则需要使用洗牌算法。