如何对List <string>中的2个不同规则进行排序

时间:2019-04-11 09:56:58

标签: c# list sorting

我需要按照2条规则对List<string>进行排序。

我的string元素将始终设置为XXXnnnnEXXXnnnnD格式,其中X是从A到Z的大写字母,而n是从0到0的数字。 9。

我想按字母顺序对列表进行排序,但是我希望E字符串位于D字符串之前,如下所示

DFG0001D
AWK0007E
ORK0127E
AWK0007D
DFG0001E
ORK0127D

需要排序为

AWK0007E
AWK0007D
DFG0001E
DFG0001D
ORK0127E
ORK0127D

我怎么能做到这一点?

感谢帮助

4 个答案:

答案 0 :(得分:5)

以下是如何使用Linq OrderByThenByDescending操作来完成此操作的代码段:

string[] arr = { "DFG0001D", "AWK0007E", "ORK0127E", "AWK0007D", "DFG0001E", "ORK0127D" };

arr = arr
   .OrderBy(r => r.Substring(0, 7))
   .ThenByDescending(s => s.Substring(7, 1))
   .ToArray();

答案 1 :(得分:1)

您可以使用自定义委托并比较第一个3个字符和最后一个3个字符:

select * from
(select bt.*, sm.newparam from
select * from big_table bt where ident is not null or cate is not null
left outer join
small_table st
on bt.ident = sm.ident 
and bt.cate - sm.cate
    union all
select *, null as newparam from big_table nbt where ident is null and cate is null) combined

小提琴示例:https://dotnetfiddle.net/YAzvB4

答案 2 :(得分:0)

像这样实现您自己的比较器:

class CustomStringComparer : IComparer<string>
{
    private readonly IComparer<string> _baseComparer;
    public CustomStringComparer(IComparer<string> baseComparer)
    {
        _baseComparer = baseComparer;
    }

    public int Compare(string x, string y)
    {
        // strings are completely same
        if (_baseComparer.Compare(x, y) == 0)
        {
            return 0;
        }

        // strings are completely same except last char
        if (_baseComparer.Compare(x.Substring(0, x.Length - 2), y.Substring(0, y.Length - 2)) == 0)
        {
            // if last char is E then win
            return x.Last() == 'E' ? -1 : 1;
        }
        // defaut compare everything else
        return _baseComparer.Compare(x, y);
    }
}

那么您就可以这样做:

static void Main(string[] args)
    {
        List<string> list = new List<string>()
        {
            "DFG0001D",
            "AWK0007E",
            "ORK0127E",
            "AWK0007D",
            "DFG0001E",
            "ORK0127D"
        };
        list.Sort(new CustomStringComparer(StringComparer.CurrentCulture));
        foreach (var item in list)
        {
            Console.WriteLine(item);
        }
    }

输出为:

AWK0007E
AWK0007D
DFG0001E
DFG0001D
ORK0127E
ORK0127D

答案 3 :(得分:0)

    var list = new List<string>{
        "DFG0001D",
        "AWK0007E",
        "ORK0127E",
        "AWK0007D",
        "DFG0001E",
        "ORK0127D"
    };

    list.Sort((str1, str2) => {
        var eq = string.Compare(str1.Substring(0, str1.Length - 1), str2.Substring(0, str2.Length - 1));
        if (eq == 0)
            eq = string.Compare(str2[str2.Length - 1].ToString(), "E");
        return eq; 
    });
    foreach (var str in list)
        Console.WriteLine(str);

输出:

AWK0007E
AWK0007D
DFG0001E
DFG0001D
ORK0127E
ORK0127D