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是该行所在函数的参数)。
您可以使用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)的操作。