我使用Linq OrderBy()
函数按显示名称对Sitecore项目的通用列表进行排序,然后构建一串管道分隔的guid,然后将其插入Sitecore字段。显示名称是产品的型号,通常约为10位数。起初看起来这似乎100%的工作,但客户发现它有问题......
这是我们迄今为止发现的一个例子。代码以某种方式认为IC-30R-LH
位于IC-30RID-LH
之后,但情况恰恰相反。
我把它放到像this one这样的在线字母表中,它能够把它弄好......
我确实尝试将StringComparer.InvariantCultureIgnoreCase
作为第二个参数添加到OrderBy()
,但它没有帮助。
这里是代码......如果您有任何想法,请告诉我。请注意,我没有在任何范围内的循环内运行此OrderBy()
调用。
private string GetAlphabetizedGuidString(Item i, Field f)
{
List<Item> items = new List<Item>();
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;
}
答案 0 :(得分: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);
这会强制对两个字符串进行逐字符(技术上逐字节)的比较,这会使&#39; - &#39; (45)在&#39; I&#39;之前(73)。