[英]Sorting a C# List<> without LINQ or delegates
我有一个对象列表,每个对象在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或委托的情况下对这样的列表进行排序? 最好是一次分配很少或没有内存的搜索,因为我需要在一帧中多次运行此东西。
将来在搜索上可能还会有其他任意约束(例如,如果距此特定对象的距离大于某个特定于对象的最大距离,请忽略它)
编辑:我不认为我清楚地解释了我的问题。 我知道排序算法,但是,所有这些解决方案都是关于2个独立的可比较对象。 我在问如何根据外部变量对这些对象进行排序。 也就是说,需要根据到对象不知道的空间中给定点的距离对它们进行排序,但是排序算法可以对它们进行排序。 我知道可以通过了解这一点的对象来完成此操作,但这使我感到不满意。
基本上,我需要一个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)运算。
在Wikipedia上查看此表。 它概述了许多常见的排序算法以及它们与其他算法相比的性能。 为了您的目的,您可以看看那些需要O(1)内存的对象。 只需选择一种算法并编写愉快的代码即可!
诸如插入排序或堆排序之类的东西应足以满足您的需求,这取决于它是否稳定。
我没有用过团结,但您也许可以使用这样的东西
alist.sort(delegate(someObject o1, someObject o2) {
// Compare property1
int compare1 = o1.proprty1.CompareTo(o2.proprty1);
if (compare1 != 0)
return compare1;
// Compare property2
return o1.proprty2.CompareTo(o2.proprty2);
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.