You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Umbraco Razor中含数字的地址字符串排序异常问题求助

解决Umbraco中地址带数字的自然排序问题

当前排序逻辑是按纯字符串字典序比较,所以"14"会排在"2"前面——因为字符串比较是逐字符对比,'1'的ASCII值小于'2',导致不符合预期的排序结果。

如果你使用的是.NET 5及以上版本(对应Umbraco 9+),可以直接利用内置的数字排序选项实现自然排序,无需拆分字符串提取数字:

  1. 首先引入必要的命名空间:
@using System.Globalization
  1. 修改Razor排序代码,在ThenBy中指定带数字排序选项的字符串比较器:
var apartments = Umbraco.Content(Guid.Parse("f3c9c894-16e5-491e-b39f-77bf2cb13c6f"))
    .ChildrenOfType("ApartmentItem")
    .Where(x => x.IsVisible())
    .OrderBy(x => x.Value("apartmentItemStatus").ToString().Replace(" ", ""))
    .ThenBy(x => x.Name.ToString().Replace(" ", ""), 
        StringComparer.Create(CultureInfo.CurrentCulture, CompareOptions.NumericOrder));

CompareOptions.NumericOrder会让比较器将字符串中的数字片段视为数值而非单个字符,这样就能得到你预期的排序结果:

  • Street Road 2
  • Street Road 14
  • Street Road 22b

如果你的项目基于.NET Framework(Umbraco 8及以下),CompareOptions.NumericOrder不可用,这种情况下要完全避免拆分字符串的话,可借助第三方自然排序库(比如NaturalSort.Extension),通过NuGet安装后使用对应的比较器:

// 安装后引入命名空间
@using NaturalSort.Extension

// 修改排序逻辑
var apartments = Umbraco.Content(Guid.Parse("f3c9c894-16e5-491e-b39f-77bf2cb13c6f"))
    .ChildrenOfType("ApartmentItem")
    .Where(x => x.IsVisible())
    .OrderBy(x => x.Value("apartmentItemStatus").ToString().Replace(" ", ""))
    .ThenBy(x => x.Name.ToString().Replace(" ", ""), StringComparer.OrdinalIgnoreCase.WithNaturalSort());

内容的提问来源于stack exchange,提问作者Morten Hagh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 04:13:13