繁体   English   中英

对没有LINQ或委托的C#List <>进行排序

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM