当前位置:  开发笔记 > 编程语言 > 正文

Linq Order在100%的时间内没有正确排序

如何解决《LinqOrder在100%的时间内没有正确排序》经验,为你挑选了1个好方法。

我正在使用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)之前.



1> Craig W...:

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

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

推荐阅读
爱唱歌的郭少文_
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有