在Umbraco站点中,我在字符串中有一个地址,因此该字符串将包含一个数字,如:Street Road 2, Street Road 14, Street Road 22b
等
我正在按地址(以及其他值)对列表进行排序
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(" ", ""));
预期的结果将是
Street Road 2
Street Road 14
Street Road 22b
但实际结果却是
Street Road 14
Street Road 2
Street Road 22b
我不知道如何正确排序。我想避免拆分字符串,取数字,转换为int等。
1条答案
按热度按时间5vf7fwbs1#
在
String
上使用一些扩展方法,可以创建一个IComparer<IEnumerable<string>>
来对IEnumerable<string>
进行排序,这样非数字字符串就可以正常排序,数字字符串按长度排序,然后按字符串值排序。然后可以将地址拆分为单词,并使用新的比较器进行排序。有了这些定义,你可以像这样使用它们:
它按预期对示例街道地址进行排序。
注意:使用围绕
ReadOnlySpan<char>
的.Net 7Regex
增强功能,您可能会编写一个WordsAndNumbersComparer
版本,该版本采用string
并在内部使用增强功能来减少比较的对象(字符串)创建。但是由于OrderBy
缓存键,因此将不变键计算拉出来可能比在排序时不断切片地址更有效。