【问题标题】:LINQ OrderBy not sorting as expected on stringLINQ OrderBy 未按预期对字符串进行排序
【发布时间】:2015-10-27 19:59:38
【问题描述】:

我正在使用 Umbraco CMS 尝试对节点的集合(DynamicNode 类型)进行排序,但 LINQ OrderBy 语句未按预期工作。我必须在这里遗漏一些东西吗?

我一直在调试这个..

DynamicNodeList thingsToDo = Model.Descendants("Tourism-Things-To-Do");
 if (thingsToDo != null && thingsToDo.Count() > 0)
    {
       foreach(dynamic thingToDo in thingsToDo)
        {
           @thingToDo.Name <br />   
        }
        <br />

        foreach(dynamic thingToDo in thingsToDo.OrderBy(x => x.Name, StringComparer.CurrentCultureIgnoreCase))
        {
           @thingToDo.Name <br />   
        }
    }

输出:

[第一次迭代的未排序列表] 品质套房酒店 戴斯酒店 棕榈树旅馆 ​超级8 温迪克雷斯特住宿加早餐旅馆 [应该是第二次迭代的按字母顺序排列的列表] 戴斯酒店 ​超级8 温迪克雷斯特住宿加早餐旅馆 棕榈树旅馆 品质套房酒店

谁能给我一些关于为什么这行不通的见解?这段代码中的Name 只是一个字符串。

【问题讨论】:

  • 你可以试试thingsToDo.OrderBy(x =&gt; x.Name.Trim(), StringComparer.CurrentCultureIgnoreCase) 吗?呈现 HTML 输出时,名称中可能存在不可见的空格。
  • 您还可以通过&lt;pre&gt; @thingToDo.Name &lt;/pre&gt; &lt;br/&gt;获得洞察力
  • 我已经尝试了这两个想法,但仍然没有运气......输出是相同的puu.sh/kZTe0/7ed123757e.png

标签: c# linq razor


【解决方案1】:

您的字符串可能从不可打印的字符开始。我建议您渲染原始字符串并查看它:

@Html.Raw(myString)

【讨论】:

  • 不错的主意,不幸的是我试过了,字符串的第一个字母是字符串的真正开头。
  • 你试过检查每个字符串的ASCII值吗?
【解决方案2】:

我能够将字符串拆分为一个 char 数组,我发现问题出在我的一些字符串开头的零宽度空格字符的实例上。我擦洗了这些字符的数组并将它们添加回列表,现在一切正常。

代码:

SortedDictionary<string, int> sd = new SortedDictionary<string, int>();
        foreach(DynamicNode thingToDo in thingsToDo)
        {
            List<char> temp = new List<char>();
            char[] parseWord = thingToDo.Name.ToCharArray();
            var brokenWord = parseWord.Select(x => x == 8203);

            var enumeratorWord = parseWord.GetEnumerator();
            var enumeratorBool = brokenWord.GetEnumerator();
            enumeratorBool.MoveNext();
             while(enumeratorWord.MoveNext())
             {
                 if(!(bool)enumeratorBool.Current)
                 {
                     temp.Add((char)enumeratorWord.Current);
                 }
             }
             var result = string.Join("", temp.ToArray());
             sd.Add(result, thingToDo.Id);   
        }

【讨论】:

    猜你喜欢
    • 2012-05-26
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 2014-01-05
    • 1970-01-01
    • 2021-12-18
    • 2018-07-07
    • 1970-01-01
    相关资源
    最近更新 更多