c#列表排序<>没有LINQ或委托

本文关键字:LINQ 没有 列表 排序 | 更新日期: 2023-09-27 18:15:57

我有一个对象列表,每个对象在3D空间中都有一个位置。我需要根据到任意一点的距离对这个列表进行排序。目前我正在使用:

_attachedEffectors = _attachedEffectors.OrderBy(x =>
        Mathf.Pow((x.transform.position.x - position.x), 2) + Mathf.Pow((x.transform.position.y - position.y), 2) + Mathf.Pow((x.transform.position.z - position.z), 2)
        ).ToList();

然而,不幸的是,我使用Unity的编译器,这是可怕的内存分配和LINQ/委托限制。有没有办法在不使用LINQ或委托的情况下对这样的列表进行排序?最理想的搜索分配很少或不分配内存,因为我需要在一帧内运行这个东西很多次。

在未来可能会有其他的,任意的搜索约束(例如,如果到这个特定对象的距离大于某个对象特定的最大距离,忽略它)

编辑:我想我没有清楚地解释我的问题。我知道排序算法,但是,所有这些解决方案都是关于两个独立的可比较对象的。我问的是如何根据外部变量对这些对象进行排序。也就是说,它们需要根据到空间中给定点的距离进行排序,对象不知道,但排序算法知道。我知道对象知道这一点是可以做到的,但这对我来说是糟糕的设计。

基本上,我需要一个Sort()实现,它接受一个参数以及要排序的对象,并使用该参数与对象一起对列表进行排序(如在LINQ实现中所见- position是该行所在函数的参数)。

c#列表排序<>没有LINQ或委托

您可以使用List.Sort()。但是,如果您想使用此方法,则存储在列表中的对象类型应该实现IComparable接口。下面我提供了一个示例代码,您可以在此基础上编写自己的代码:

public class Customer : IComparable<Customer>
{
    public int Age { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public Customer(int age, string firstName, string lastName)
    {
        Age = age;
        FirstName = firstName;
        LastName = lastName;
    }
    public int CompareTo(Customer other)
    {
        return Age.CompareTo(other.Age);
    }
}
class Program
{
    static void Main(string[] args)
    {
        List<Customer> customers = new List<Customer>
        {
            new Customer(25,"a","b"),
            new Customer(21,"c","d"),
            new Customer(22,"e","f"),
            new Customer(28,"g","i"),
            new Customer(30,"j","k"),
            new Customer(23,"l","m"),
            new Customer(31,"a","b"),
        };

        customers.Sort();
        foreach (var customer in customers)
        {
            Console.WriteLine(customer.Age);
        }
        Console.ReadKey();
    }
}

关于List.Sort()方法的复杂度,MSDN中有说明,

该方法平均为O(n log n)次运算,其中n为Count;在最坏的情况下,它是一个O(n ^ 2)的操作。