Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 包含以下划线开头的字符串的列表排序_C#_List_Sorting_Criteria_Collation - Fatal编程技术网

C# 包含以下划线开头的字符串的列表排序

C# 包含以下划线开头的字符串的列表排序,c#,list,sorting,criteria,collation,C#,List,Sorting,Criteria,Collation,这就是我得到的: 我有一个包含以下字符串的列表:“学生”、“学生”、“学生”、“学生”和“学生” 我所做的: List<string> sort = new List<string>() { "student", "Students", "students", "Student","_Students" }; List<string> custsort = sort.OrderBy(st => st[0]).ThenBy(s => s.Length

这就是我得到的: 我有一个包含以下字符串的列表:“学生”、“学生”、“学生”、“学生”和“学生”

我所做的:

List<string> sort = new List<string>() { "student", "Students", "students", "Student","_Students" };
List<string> custsort = sort.OrderBy(st => st[0]).ThenBy(s => s.Length)
                                                             .ToList();
我想要的是:

_Students
Student
Students
student
students

我不知道如何排序它们,因为该死的下划线位于ASCII表中的大写字母和小写字母之间。

您可以考虑,例如<代码> < /C> >是<代码>(空间)< /代码>,像这样:

List<string> custsort = sort.OrderBy(st => st.Replace('_', ' '))
                            .ToList();
List custsort=sort.OrderBy(st=>st.Replace(“”、“”)
.ToList();
这将把
\u学生
放在所有其他
*学生
之前。。。此时,按
然后按(s=>s.Length)
排序将是无用的


如果已经有以空格开头的字符串,这显然会造成一点混乱。如果有,请用另一个字符更改空格。

您可以使用仅返回true或false的排序条件-任何false项都会放在任何true项之前。在下面的代码中,我添加了第一个
OrderBy
,它将以下划线开头的项目放在第一位

List<string> custsort = sort.OrderBy(st => st[0] != '_')
                        .ThenBy(st => st[0])
                        .ThenBy(s => s.Length)
                        .ToList();
List custsort=sort.OrderBy(st=>st[0]!=''\u')
.ThenBy(st=>st[0])
.ThenBy(s=>s.Length)
.ToList();

查询的其余部分使用与以前相同的规则—按第一个字符排序,然后按每个字符串的长度排序

可以使用正则表达式确定第一个字符是否为字母,并对其应用权重

int GetWeight(char c)
{
    return Regex.IsMatch(c.ToString(), @"[a-zA-Z]") ? c : 0;
}

List<string> sort = new List<string>() { "student", "Students", "students", "Student","_Students" };
List<string> custsort =
    sort.OrderBy(st => GetWeight(st[0]))
        .ThenBy(s => s.Length)
        .ToList();
int GetWeight(字符c)
{
返回Regex.IsMatch(c.ToString(),@“[a-zA-Z]”),c:0;
}
列表排序=新列表(){“学生”、“学生”、“学生”、“学生”、“学生”、“_学生”};
列表排序=
sort.OrderBy(st=>GetWeight(st[0]))
.ThenBy(s=>s.Length)
.ToList();

这样,如果您需要任何其他特殊规则,您可以修改
GetWeight
函数,您的Linq将不受影响。

是您唯一的特殊字符吗?您还有什么其他要求?另外,您是否希望区分大小写?我想是的,但不清楚。
int GetWeight(char c)
{
    return Regex.IsMatch(c.ToString(), @"[a-zA-Z]") ? c : 0;
}

List<string> sort = new List<string>() { "student", "Students", "students", "Student","_Students" };
List<string> custsort =
    sort.OrderBy(st => GetWeight(st[0]))
        .ThenBy(s => s.Length)
        .ToList();