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