D365 FO Array增加排序
标签:void 类型 == rgb value param ast span 场景
X++的集合类,Array,List,Set里没有可以提供排序的功能,如果要对元素排序不是很方便。
D365 FO支持扩展,所以可以很方便地给这些集合类增加排序功能,这里以Array为例,只实现了数值和字符串的排序,至于class和record类型的,目前还没遇到需要排序的场景,就暂时不实现了,用到再说。
[ExtensionOf(classStr(Array))]
public final class Array_Class_Extension
{
///
/// 使用快速排序法对Array元素进行排序
///
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;
}
}
///
/// 把排序后的数组以字符串方式拼接输出
///
/// 元素之间的分隔符
/// 排序后以分隔符连接的字符串
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;
}
}
}
D365 FO Array增加排序
标签:void 类型 == rgb value param ast span 场景
原文地址:https://www.cnblogs.com/Farseer1215/p/14191879.html
评论