【问题标题】:Linq OrderBy not sorting correctly 100% of the timeLinq OrderBy 100% 的时间没有正确排序
【发布时间】:2015-12-30 00:18:58
【问题描述】:

我正在使用 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;
    }

【问题讨论】:

  • 您是否检查过似乎出现故障的破折号的字符代码?可能不是普通“-”的45。
  • 排序行为是否一致?
  • 我相信 Craig W. 的答案是你所需要的,但一些谷歌搜索很快让我想到了这个类似的问题:stackoverflow.com/questions/3680523/…
  • 谢谢@Starceaker 我会看看那个。

标签: c# linq


【解决方案1】:

我能够使用以下代码重现您的问题:

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)之前。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多