惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Google DeepMind News
Google DeepMind News
WordPress大学
WordPress大学
S
SegmentFault 最新的问题
小众软件
小众软件
爱范儿
爱范儿
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
量子位
博客园_首页
T
Tailwind CSS Blog
The Cloudflare Blog
J
Java Code Geeks
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
U
Unit 42
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
人人都是产品经理
人人都是产品经理
N
Netflix TechBlog - Medium
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
腾讯CDC
P
Proofpoint News Feed
aimingoo的专栏
aimingoo的专栏
Recent Announcements
Recent Announcements
T
The Blog of Author Tim Ferriss
D
Docker
Microsoft Azure Blog
Microsoft Azure Blog

博客园 - 佛西亚

https访问 asp.net Core上传文件 .NET Framework 4.0 DLL注册GAC 使用iText 7读取PDF文件中的文本和图片 用SQL Server Profiler跟踪AX执行的SQL语句 D365升级包 Ant Design Pro V5 + Django Restful Framework Token认证前台实现 Ant Design Pro V5 + Django Restful Framework Token认证后台实现(二) Ant Design Pro V5 + Django Restful Framework Token认证后台实现(一) D365 FO产生随机字符串 D365 FO无法命中断点 Ant Design Pro V5 开发时使用后台服务数据 JavaScript跨域访问 同步数据库报错 DataEntity增加关联DataSource Java通过代理上传文件到Azure blob 使用iText7操作PDF D365 FO Json序列化和反序列化 D365 FO操作Azure Blob
D365 FO Array增加排序
佛西亚 · 2020-12-26 · via 博客园 - 佛西亚

X++的集合类,Array,List,Set里没有可以提供排序的功能,如果要对元素排序不是很方便。

D365 FO支持扩展,所以可以很方便地给这些集合类增加排序功能,这里以Array为例,只实现了数值和字符串的排序,至于class和record类型的,目前还没遇到需要排序的场景,就暂时不实现了,用到再说。

[ExtensionOf(classStr(Array))]
public final class Array_Class_Extension
{       
    /// <summary>
    /// 使用快速排序法对Array元素进行排序    
    /// </summary>
    public void sort()
    {
        this.quickSort(1, this.lastIndex());        
    }    
    private void quickSort(
      int _left, 
      int _right)
    {
        int i = _left;
        int j = _right;        
        if (i < j)
        {
            anytype pivot = this.value(i);
            while (i < j)
            {
                while (this.greaterThan(this.value(j), pivot) && (i < j))
                {
                    j--;
                }                
                this.value(i, this.value(j));                
                while (this.lessThanOrEqual(this.value(i), pivot) && (i < j))
                {
                    i++;
                }
                this.value(j, this.value(i));
            }
            this.value(i, pivot);
            this.QuickSort(_left, i - 1);
            this.QuickSort(j + 1, _right);
        }
    }

    private boolean greaterThan(
        anytype _valueLeft, 
        anytype _valueRight)
    {        
        switch (this.typeId())
        {
            case Types::Int64:
            case Types::Integer:
            case Types::Real:
                return _valueLeft > _valueRight;
            default:
                return strCmp(_valueLeft.toString(), _valueRight.toString()) == 1;
        }
    }

    private boolean lessThanOrEqual(
        anytype _valueLeft,
        anytype _valueRight)
    {
        switch (this.typeId())
        {
            case Types::Int64:
            case Types::Integer:
            case Types::Real:                
                return _valueLeft <= _valueRight;
            default:
                return strCmp(_valueLeft.toString(), _valueRight.toString()) == -1 
                        || strCmp(_valueLeft.toString(), _valueRight.toString()) == 0;
        }
    }

    /// <summary>
    /// 把排序后的数组以字符串方式拼接输出
    /// </summary>
    /// <param name = "_delimiter">元素之间的分隔符</param>
    /// <returns>排序后以分隔符连接的字符串</returns>
    public str sortString(str _delimiter = "")
    {
       this.sort();

        str destStr = "";
        for (int i = 1; i <= this.lastIndex(); i++)
        {
            destStr += this.value(i).ToString() + _delimiter;
        }
        if (_delimiter)
        {
            return subStr(destStr, 1, strLen(destStr) -1);
        }
        else
        {
            return destStr;
        }
    }

}