我正在使用Linq OrderBy()
函数按显示名称对Sitecore项目的通用列表进行排序,然后构建一系列管道分隔的guid,然后将其插入Sitecore字段.显示名称是产品的型号,通常约为10位数.起初看起来这种情况在100%的时间都有效,但客户发现它有问题...
这是我们迄今为止发现的一个例子.代码以某种方式认为IC-30R-LH
是后来的IC-30RID-LH
,但反过来应该是真的.
我把它放到像这样的在线alphabetizer中,它能够正确...
我确实尝试添加StringComparer.InvariantCultureIgnoreCase
作为第二个参数,OrderBy()
但它没有帮助.
这是代码......如果您有任何想法,请告诉我.请注意,我没有OrderBy()
在任何范围内在循环内运行此调用.
private string GetAlphabetizedGuidString(Item i, Field f) { List- items = new List
- (); StringBuilder scGuidBuilder = new StringBuilder(); if (i != null && f != null) { foreach (ID guid in ((MultilistField)f).TargetIDs) { Item target = Sitecore.Data.Database.GetDatabase("master").Items.GetItem(guid); if (target != null && !string.IsNullOrEmpty(target.DisplayName)) items.Add(target); } // Sort it by item name. items = items.OrderBy(o => o.DisplayName, StringComparer.InvariantCultureIgnoreCase).ToList(); // Build a string of pipe-delimited guids. foreach (Item item in items) { scGuidBuilder.Append(item.ID); scGuidBuilder.Append("|"); } // Return string which is a list of guids. return scGuidBuilder.ToString().TrimEnd('|'); } return string.Empty; }
Craig W... 9
我能够使用以下代码重现您的问题:
var strings = new string[] { "IC-30RID-LH", "IC-30RID-RH", "IC-30R-LH", "IC-30R-RH"}; var sorted = strings.OrderBy(s => s);
通过在排序中添加比较器,我也能够获得所需的排序顺序.
var sorted = strings.OrderBy(s => s, StringComparer.OrdinalIgnoreCase);
这迫使两个字符串逐字符(技术上逐字节)比较,将' - '(45)放在'I'(73)之前.
我能够使用以下代码重现您的问题:
var strings = new string[] { "IC-30RID-LH", "IC-30RID-RH", "IC-30R-LH", "IC-30R-RH"}; var sorted = strings.OrderBy(s => s);
通过在排序中添加比较器,我也能够获得所需的排序顺序.
var sorted = strings.OrderBy(s => s, StringComparer.OrdinalIgnoreCase);
这迫使两个字符串逐字符(技术上逐字节)比较,将' - '(45)放在'I'(73)之前.