Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq 什么';实现OrderBy/ThenBy的明智方法是什么?_Linq_Algorithm_Language Agnostic - Fatal编程技术网

Linq 什么';实现OrderBy/ThenBy的明智方法是什么?

Linq 什么';实现OrderBy/ThenBy的明智方法是什么?,linq,algorithm,language-agnostic,Linq,Algorithm,Language Agnostic,我正在Lua中实现一个LINQ克隆,但这在这里不太相关,我已经完成了大多数功能(可枚举/可查询,还没有预编译程序),但是想不出一个聪明的方法来实现OrderBy的ThenBy 目前我只排序一次,然后放入新的列表,然后对这些子列表进行排序,最后再次合并结果,但这似乎非常浪费和不雅,我相信有人想出了一个聪明的方法来做到这一点(更好的算法),但我不知道它是什么。关于如何有效地实施OrderBy/Thenby,有什么线索吗 注意:语言和语言结构希望在这里不相关,我正在寻找通用算法,就像任何语言都可以进行

我正在Lua中实现一个LINQ克隆,但这在这里不太相关,我已经完成了大多数功能(可枚举/可查询,还没有预编译程序),但是想不出一个聪明的方法来实现OrderBy的ThenBy

目前我只排序一次,然后放入新的列表,然后对这些子列表进行排序,最后再次合并结果,但这似乎非常浪费和不雅,我相信有人想出了一个聪明的方法来做到这一点(更好的算法),但我不知道它是什么。关于如何有效地实施OrderBy/Thenby,有什么线索吗

注意:语言和语言结构希望在这里不相关,我正在寻找通用算法,就像任何语言都可以进行二进制排序一样


编辑:目前我正在研究LINQ to对象,因此任何关于如何实现该目标的想法都将非常棒。我猜OrberBy/ThenBy是两个函数调用,不是一个,但我可能错了。

通常,您会使用合适的比较方法实现多键排序。例如,要按姓氏和姓氏对名称列表进行排序,可以使用如下比较函数:

int compareNames(Name n1, Name n2)
{
    if (n1.LastName < n2.LastName) {
        return -1;
    } else if (n1.LastName > n2.LastName) {
        return 1;
    } else if (n1.FirstName < n2.FirstName) {
        return -1;
    } else if (n1.FirstName > n2.FirstName) {
        return 1;
    } else {
        return 0;
    }
}
int比较名称(名称n1,名称n2)
{
如果(n1.LastNamen2.LastName){
返回1;
}否则如果(n1.FirstNamen2.FirstName){
返回1;
}否则{
返回0;
}
}

这里的关键点是,除非我们已经知道两个
LastName
成员是相等的,否则我们不会查看
FirstName
成员。

我认为这也适用于:

function(lh,rh)
    if lh.first < rh.first then
        return true
    elseif lh.second < rh.second then
        return true
    end
    return false
end
功能(左侧、右侧)
如果先左后右,则
返回真值
elseif左秒<右秒
返回真值
结束
返回错误
结束
如果为真,这意味着这应该有效:

tests={}
tests[1]=function(lh,rh) 
    return lh.first < rh.first
end
tests[2]=function(lh,rh)
    return lh.second < rh.second
end

function(lh,rh)
    local res=true
    local k,v
    for k,v in ipairs(tests) do
        res = v(lh,rh)
        if res then break end
    end
    return res
end
tests={}
测试[1]=功能(左侧、右侧)
返回左侧优先<右侧优先
结束
测试[2]=功能(左侧、右侧)
返回左秒<右秒
结束
功能(左、右)
本地res=真
本地k,v
对于IPAIR(测试)中的k,v
res=v(左、右)
如果是res,则中断结束
结束
返回res
结束

但是OrderBy/ThenBy不应该在两个不同的函数调用中完成吗?@Robert-至少对于Linq2SQL,它使用整个方法链来生成一个表达式,从而实现所需的结果。根据您的克隆是否使用延迟执行,它可能会导致orderby/thenby崩溃为单个比较。我不确定“仅限true和false”是什么意思。我的示例比较函数比较两个元素(n1,n2),如果n1n2,则返回1。我的意思是1和-1都是真的。0为false(在大多数情况下)。我想知道符号+/-是否对您的分拣机(在集合上调用分拣算法的功能)有任何影响是的,当然有,否则分拣机如何知道元素的放置顺序?此类型的示例分类器函数是C标准库中的qsort():