3

ここに私が得たものがあります: 「学生」、「学生」、「学生」、「学生」、「_学生」という文字列を含むリストがあります。

私がやった事:

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

しかし、これは私にこのようなものを与えます:

Student
Students
_Students
student
students

そして、私が欲しいのは:

_Students
Student
Students
student
students

ASCII テーブルの大文字と小文字の間にアンダースコアが配置されているため、それらを並べ替える方法がわかりません。

4

3 に答える 3

4

正規表現を使用して、最初の文字が文字であるかどうかを判断し、それに重みを適用できます。

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();

このようにして、他の特別なルールが必要な場合は、GetWeight関数を変更でき、Linq は影響を受けません。

于 2013-08-29T12:59:47.773 に答える
1

たとえば、次のように を と見なすことができ_ます(space)

List<string> custsort = sort.OrderBy(st => st.Replace('_', ' '))
                            .ToList();

これにより_Students、他のすべての前に配置*studentsされます...この時点で、並べ替えはThenBy(s => s.Length)役に立ちません。

スペースで始まる文字列がすでにある場合、これは明らかに少し乱れます。それらがある場合は、スペースを別の文字に変更します。

于 2013-08-29T12:48:05.063 に答える
0

true または false を返すだけの順序付け基準を使用できます。false の項目は true の項目の前に置かれます。OrderBy以下のコードでは、アンダースコアで始まる項目を最初に配置する first を追加しました。

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

クエリの残りの部分では、以前と同じルールを使用します。つまり、最初の文字で並べ替え、次に各文字列の長さで並べ替えます。

于 2013-08-29T12:59:10.063 に答える