在C#中对字符串进行排序

Mar*_*eld 4 c# sorting

我有一个需要分类的分隔字符串.首先,我需要检查'Francais'是否在字符串中,如果是,它首先出现,然后'Anglais'是下一个,如果存在的话.之后,其他一切都按字母顺序排列.谁能帮我?这是我到目前为止所没有的排序

private string SortFrench(string langs)
    {
       string _frenchLangs = String.Empty;
       string retval = String.Empty;

        _frenchLangs = string.Join(" ; ",langs.Split(';').Select(s => s.Trim()).ToArray());

        if (_frenchLangs.Contains("Francais"))
            retval += "Francais";

        if (_frenchLangs.Contains("Anglais"))
        {
            if (retval.Length > 0)
                retval += " ; ";

            retval += "Anglais";
        }

        //sort the rest

        return retval;
    }
Run Code Online (Sandbox Code Playgroud)

Kev*_*son 11

有人喜欢我的评论,所以我想继续把它转换成你的代码:

private string SortFrench(string langs)
{
    var sorted          = langs.Split(';')
        .Select(s => s.Trim())
        .OrderByDescending( s => s == "Francais" )
        .ThenByDescending( s => s == "Anglais" )
        .ThenBy ( s => s )
        .ToArray();

    return string.Join(" ; ",sorted);
}
Run Code Online (Sandbox Code Playgroud)

我的语法可能略有不同,因为我已经在Unix世界中待了一段时间并且最近没有使用太多的LINQ,但希望它有所帮助.


Sam*_*ica 6

您应该使用自定义比较器

它允许您使用内置的集合排序函数,或使用您自己的标准的linq OrderBy

  • 完成一项简单的任务有点复杂,不是吗? (4认同)

Pie*_*ult 5

这就是我想出来的.您可以在Select之后更改.Sort()for OrderBy(lang => lang),但我发现它更干净.

public string SortLanguages(string langs)
{
    List<string> languages = langs.Split(';').Select(s => s.Trim()).ToList();

    languages.Sort();
    PlaceAtFirstPositionIfExists(languages, "anglais");
    PlaceAtFirstPositionIfExists(languages, "francais");

    return string.Join(" ; ", languages);
}

private void PlaceAtFirstPositionIfExists(IList<string> languages, string language)
{
    if (languages.Contains(language))
    {
            languages.Remove(language);
            languages.Insert(0, language);
    }
}
Run Code Online (Sandbox Code Playgroud)