gpt4 book ai didi

c# - 对分数和带分数列表进行排序

转载 作者:太空宇宙 更新时间:2023-11-03 16:28:52 25 4
gpt4 key购买 nike

我正在寻找一种方法,让我可以有一个列,我只需手动输入一个数字,然后列表就会根据这个列表自行排序,这将使用 c# 作为列表的语言,它是微软SQL

我的信息不多,但如果有人想知道其他任何事情,请随时提问,我会尽力回答。

它们当前存储为字符串。

导致它被丢弃的原因是因为一些列表包含范围但一些包含分数,两者显示相同 I.E 1/2 可能意味着 1-2 或 1/2(一半)

所有的 SQL 连接都是使用 NHibernate 完成的。

不简单地对其进行正常排序的原因是,该列表目前使用分数排序并且列表工作正常,但是当它超过 1 时,它似乎会中断并将所有这些都扔到列表的底部 I.E :

Image List

我希望它如何工作的示例:

我会在我的数据库中有一列名为“DisplayOrder”或类似的东西。

数据库行显示“1”,这将是列表中出现的第一个项目。数据库行显示“8”,这将是列表中出现的第 8 个项目。

最佳答案

我整理了一个快速函数来解析您的分数并将它们转换为 float ,然后可以将其用于比较和排序。在“卫生”步骤中您可能需要更多,可能规范化空格、删除其他字符等,并且可能必须检查除数是否为零(只有您知道您的数据)。

create function dbo.FractionToFloat(@fraction varchar(100))
returns float
as
begin
declare @input varchar(100)
, @output float
, @whole int
, @dividend int
, @divisor int

-- Sanitize input
select @input = ltrim(rtrim(replace(replace(@fraction, '''', ''), '"', '')))

select @whole = cast(case
when charindex('/', @input) = 0 then @input
when charindex(' ', @input) = 0 then '0'
else left(@input, charindex(' ', @input) - 1)
end as int)

select @dividend = cast(case
when charindex('/', @input) = 0 then '0'
when charindex(' ', @input) = 0 then left(@input, charindex('/', @input) - 1)
else substring(@input, charindex(' ', @input) + 1, charindex('/', @input) - charindex(' ', @input) - 1)
end as int)

select @divisor = cast(case
when charindex('/', @input) = 0 then '1'
else right(@input, charindex('/', reverse(@input)) - 1)
end as int)

select @output = cast(@whole as float) + (cast(@dividend as float) / cast(@divisor as float))

return @output
end

这样,您就可以像这样简单地按函数的输出进行排序:

select *
from MyTable
order by dbo.FractionToFloat(MyFractionColumn)

我通常不建议滚动你自己的解析器,你必须在数据更改时维护它,但这在表面上看起来很简单,并且可能比手动维护序数列更好。此外,如果您必须比较各种单位(英尺到英寸,分钟到秒),那么这会变得更加复杂。我正在删除您的演示数据中任何看起来像单元的内容。

关于c# - 对分数和带分数列表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11543376/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com