C# 如何对列表进行排序<;字符串>;一个字一个字?

C# 如何对列表进行排序<;字符串>;一个字一个字?,c#,list,sorting,C#,List,Sorting,以下代码 static void Main(string[] args) { List<string> list = new List<string>(); list.Add("using System;"); list.Add("using System.Linq;"); list.Add("using System.Collections.Generic;"); Console.WriteLine(RandomPassword(

以下代码

static void Main(string[] args)
{
    List<string> list = new List<string>();
    list.Add("using System;");
    list.Add("using System.Linq;");
    list.Add("using System.Collections.Generic;");
    Console.WriteLine(RandomPassword());
}
我试过了

List = List.OrderByDescending(x => x).ToList();

但是不起作用

假设您希望在末尾有一个数组,而不是一个列表,那么使用它应该会得到一个顺序正确的数组:

string[] mySortedArray = list.OrderBy(x => x.Replace(";", string.Empty)).ToArray()
如果您需要基于原始代码的列表:

list = list.OrderBy(x => x.Replace(";", string.Empty)).ToList()
这里有两件事需要注意-第一,与您的代码不同,这种排序是递增的,而不是递减的;其次,为了得到所需的结果,您需要在排序时去掉分号,否则它们会扭曲结果,导致您希望先到后的项目


不过,正如评论中所指出的,您发布的代码中还存在许多其他问题。

假设您希望在末尾有一个数组,而不是一个列表,那么使用它应该会得到一个顺序正确的数组:

string[] mySortedArray = list.OrderBy(x => x.Replace(";", string.Empty)).ToArray()
如果您需要基于原始代码的列表:

list = list.OrderBy(x => x.Replace(";", string.Empty)).ToList()
这里有两件事需要注意-第一,与您的代码不同,这种排序是递增的,而不是递减的;其次,为了得到所需的结果,您需要在排序时去掉分号,否则它们会扭曲结果,导致您希望先到后的项目


不过,正如评论中指出的,您发布的代码中还存在许多其他问题。

您可以实现自定义比较器:

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

        public int Compare(string x, string y)
        {
            string xTrimmed = RemoveSemicolon(x);
            string yTrimmed = RemoveSemicolon(y);
            return _baseComparer.Compare(xTrimmed, yTrimmed);
        }

        string RemoveSemicolon(string x)
        {
            return Regex.Replace(x, ";", "");
        }
    }

排序就地完成,无需在任何地方分配结果。

您可以实现自定义比较器:

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

        public int Compare(string x, string y)
        {
            string xTrimmed = RemoveSemicolon(x);
            string yTrimmed = RemoveSemicolon(y);
            return _baseComparer.Compare(xTrimmed, yTrimmed);
        }

        string RemoveSemicolon(string x)
        {
            return Regex.Replace(x, ";", "");
        }
    }

排序是就地完成的,不需要在任何地方分配结果。

问题在于
位于中用于排序的
之后

list.OrderBy(x => x)

    using System.Collections.Generic;
    using System.Linq;
    using System;                      <=== ; comes after dot

问题是
位于中用于排序的
之后

list.OrderBy(x => x)

    using System.Collections.Generic;
    using System.Linq;
    using System;                      <=== ; comes after dot

在C#
列表中
是一个类型,在代码
列表中
列表
类型的一个实例。因此,您编写的代码不应该编译,因为您不能为类型赋值
但不起作用
对诊断问题没有多大帮助。只需执行
list.Sort()list=list.OrderByDescending(x=>x.ToArray()
,当指定给的数据类型是
列表时,为什么要强制转换到数组?您发布的代码存在一些与您的问题无关的重大问题,需要在我们帮助您之前解决这些问题。请阅读关于如何提问的常见问题解答,并提供一个可验证的最小示例。请用实际问题描述替换“但不起作用”。我已根据@Sam的输入更新了我的代码,是的,这是我第一次使用此平台,在试图使其正确的同时,我手动键入了代码,因此我错过了演员阵容。很抱歉在C#
列表中
是一个类型,在代码
列表中
列表
类型的一个实例。因此,您编写的代码不应该编译,因为您不能为类型赋值
但不起作用
对诊断问题没有多大帮助。只需执行
list.Sort()list=list.OrderByDescending(x=>x.ToArray()
,当指定给的数据类型是
列表时,为什么要强制转换到数组?您发布的代码存在一些与您的问题无关的重大问题,需要在我们帮助您之前解决这些问题。请阅读关于如何提问的常见问题解答,并提供一个可验证的最小示例。请用实际问题描述替换“但不起作用”。我已根据@Sam的输入更新了我的代码,是的,这是我第一次使用此平台,在试图使其正确的同时,我手动键入了代码,因此我错过了演员阵容。很抱歉除了分号,替换周期的问题是,它也会扭曲结果。例如,如果您有:
使用Net.Services.Anchors;使用Net.Services.Communication;使用Net.ServicesBinder.Helpers
或类似工具,
Net.ServicesBinder.Helpers
将出现在其他两个工具之间,这似乎不合逻辑;和。如果使用空字符串,则如果将它们都设置为相同的(例如,替换为),则他的示例顺序正确谢谢,我已更新了我的答案。在给定的示例中,我认为使用自定义比较器可能有些过分,但如果有人需要更复杂情况的解决方案,我就不使用它。除了分号之外,替换句点的问题是,它也会扭曲结果。例如,如果您有:
使用Net.Services.Anchors;使用Net.Services.Communication;使用Net.ServicesBinder.Helpers
或类似工具,
Net.ServicesBinder.Helpers
将出现在其他两个工具之间,这似乎不合逻辑;和。如果使用空字符串,则如果将它们都设置为相同的(例如,替换为),则他的示例顺序正确谢谢,我已更新了我的答案。在给定的示例中,我认为使用自定义比较器可能有点过头了,但如果有人需要更复杂情况的解决方案,我就不使用它。哇,谢谢,这正是我需要的,你帮了我很大的忙,Diado,你的回答非常有帮助,我也标记了你的解决方案。:-)哇,谢谢,这正是我需要的,你帮了我很大的忙,迪亚多,你的回答很有帮助,我也标记了你的解决方案。:-)谢谢有没有办法分辨哪个在哪个之后?例如;你的意思是,除了查看Unicode字符集链接外,还要先查看最低数字?试试这个:
if(“!”<”){Console.WriteLine(“yay”);}
谢谢!有没有办法分辨哪个在哪个之后?例如;你的意思是,除了查看Unicode字符集链接外,还要先查看最低数字?试试这个:
if(“!”<”){Console.WriteLine(“yay”);}