在不使用 LINQ 或委托的情况下对 C# 列表 <> 进行排序

2023-12-12

我有一个对象列表,每个对象在 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 或委托的情况下对这样的列表进行排序?最好是分配很少或不分配内存的搜索,因为我需要一帧多次运行这个东西。

此外,将来可能会对搜索存在其他任意约束(例如,如果距此特定对象的距离大于某个对象特定的最大距离,请忽略它)

编辑:我认为我没有清楚地解释我的问题。我知道排序算法,但是,所有这些解决方案都涉及两个独立的可比较对象。我问如何对这些对象进行排序关于外部变量。也就是说,它们需要按照对象到空间中给定点的距离进行排序。don't知道,但排序算法知道。我知道这可以通过了解这一点的对象来完成,但这对我来说是糟糕的设计。

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


你可以使用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) 操作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在不使用 LINQ 或委托的情况下对 C# 列表 <> 进行排序 的相关文章

随机推荐

  • 如何在cloudfront之间设置SSL作为具有EC2自定义源的反向代理缓存?

    我的域名指向 cloudfront 而 cloudfront 又使用自定义源引用我的 EC2 实例 在本例中 它是来自 EC2 的公共 DNS 名称 例如 xxxxx us west 2 compute amazonaws com 这使得它
  • 尝试调用 WCF Webservice 4.0 时出现返回类型无效错误

    我正在尝试编写和调用 WCF Web 服务 以下是详细信息 网页配置
  • 如何在 Parse 上取回用户数据?

    我想取回 Parse t 上 User 中 requestActive 中的数据 我试试这个 var user PFUser var requestActive user requestActive 但是 错误 实例成员 user 不能在类
  • 将 Observable 转换为异步生成器

    我正在尝试将 rxjs 与 babeljs 结合使用来创建一个异步生成器函数 该函数在next被调用 抛出时error被调用 并完成时complete叫做 我遇到的问题是我无法从回调中屈服 I can await处理返回 抛出要求的 Pro
  • 在 Jelly Bean 上访问其他 Android 应用程序的资源

    我有两个 Android 应用程序 一个是免费的 阅读器 应用程序 另一个是付费的 数据 应用程序 其资产的子目录中有一个文本文件 阅读器应用程序使用以下代码来访问数据应用程序的文本文件 Intent myIntent new Intent
  • 如何在 MyBatis 中使用 UUID 类型处理程序和 @Many 注释?

    我正在使用 mybatis spring boot starter 2 1 0 版本 我需要处理 UUID 类型来获取嵌套集合 Select SELECT id name FROM t service s Results value Res
  • 如何在 Android 中的 MapView 上绘制 KML 文件?

    我必须将 KML 文件绘制到 MapView 中 我看了 在互联网上 但我没有找到如何做到这一点的示例 如果有人可以举例说明如何做到这一点 那就太好了 现在不支持 KML 您可以像这样绘制轨迹 无需 KML 1 向Google服务发出请求
  • 在 Visual Studio 中使用控制台应用程序的输出而不是控制台

    当使用 Eclipse 用 Ja va 编写控制台应用程序时 我看到输出被放入 IDE 本身的文本框中 而不是像 Visual Studio 中那样弹出控制台 这很方便 因为即使程序退出后 我仍然可以充分利用其中写入的文本 因为直到再次运行
  • Pandas shift - 如果满足多个条件,则获取先前的值

    我实际上已经问过这个关于 SQL 的问题 并在这里得到了一个很好的答案 SQL 如果满足使用多个先前列的条件 则 LAG 获取先前的值 但现在我需要它来养熊猫 假设我们有一个数据框 df pd DataFrame id 1 2 3 4 5
  • Python 类方法改变自身

    这不适用于我正在做的任何事情 这只是一些测试代码 因为我只是在学习类方法并且很糟糕 但是假设我有以下代码 class Test int def init self arg self arg def thing self self 10 并去
  • 将外部geojson添加到leaflet层

    我是传单和 JavaScript 的新手 我想我可以使用 geocommons 和 GeoJSON 来托管测绘项目的数据 I found 外部 GeoJSON 和 Leaflet 其他方式 本教程介绍如何使用传单插件读取外部 GeoJSON
  • 如果属性名称以 new 开头,应用程序将崩溃

    在我的项目中 我使用 coredata 其中一个实体有一个名为newTotal 在其对应的 NSManagedObject 类中 属性声明如下 property nonatomic strong NSString newTotal 如果我在
  • Yii2 如何从 url 中删除站点/索引和页面参数

    我在默认页面上使用分页 即在 yii2 中的站点 索引上 所以链接器为分页生成的 URL 看起来像这样 domain com site index page 1 我想删除站点 索引和页面参数 使其如下所示 domain com 1 我尝试在
  • WPF 网格水平对齐不起作用。尺寸不变

    我有一个堆栈 堆栈内有一个网格 当我调整窗口大小时 我需要增加堆栈和网格大小 我将 Stack 和 Grid Horizo ntalAlignment 设置为 拉伸 堆栈工作正常 但当我调整窗口大小时 网格大小不会增加 这是我的代码
  • TensorFlow 索引无效(越界)

    您好 我目前正在尝试使用自己的图像数据运行 TensorFlow 但是当我尝试运行这些函数时它崩溃了 它来自 mnist py def loss fn logits labels batch size tf size labels labe
  • opengl:如何避免纹理缩放

    我该如何申请重复无论应用的顶点数据如何 纹理始终保持其原始比例 纹理中的 1 个像素 屏幕上的 1 个像素 我意识到这不是最常见的任务 但是是否可以轻松设置 opengl 来执行此操作 或者我是否需要对尊重其原始外观的顶点数据应用某种掩码
  • java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法以选择 sqlite

    我是安卓世界的新手 我的编码有问题 这只是一个小错误 我不知道它不起作用 即使我改变了其他方法 但错误仍然是相同的错误 这里的错误发生在logcat java lang NullPointerException Attempt to inv
  • 使用 DOM 选项定位 DataTables 元素

    我无法正确定位l长度变化和f分别过滤我的右上角和左下角的输入DT datatable输出在shiny使用dom选项 代码 library shiny library DT set seed 2282018 company lt data f
  • Firebase - 限制特定用户的文件访问权限

    我正在尝试使用 Firebase 实现以下行为 用户使用 Firebase 身份验证登录 用户将文件上传到 Firebase 存储 用户输入不同用户的电子邮件地址 该用户帐户可能已经存在 如果没有 收件人会收到一封电子邮件 提示他们注册 上
  • 在不使用 LINQ 或委托的情况下对 C# 列表 <> 进行排序

    我有一个对象列表 每个对象在 3D 空间中都有一个位置 我需要按到任意点的距离对这个列表进行排序 目前我正在这样做 attachedEffectors attachedEffectors OrderBy x gt Mathf Pow x t