c#中的字符串排序

本文关键字:排序 字符串 | 更新日期: 2023-09-27 18:13:37

我有一个需要排序的分隔字符串。首先我需要检查'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;
    }

c#中的字符串排序

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

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

我的语法可能会有一些偏差,因为我在Unix世界已经有一段时间了,最近也没有使用太多的LINQ,但希望它能有所帮助。

这是我想到的。您可以在选择后将.Sort()更改为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);
    }
}

您应该使用自定义比较器类

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

试试这个:

private string SortFrench(string langs)
{
    string _frenchLangs = String.Empty;
    List<string> languages = langs
        .Split(';')
        .Select(s => s.Trim())
        .OrderBy(s => s)
        .ToList();
    int insertAt = 0;
    if (languages.Contains("Francais"))
    {
        languages.Remove("Francais");
        languages.Insert(insertAt, "Francais");
        insertAt++;
    }
    if(languages.Contains("Anglais"))
    {
        languages.Remove("Anglais");
        languages.Insert(insertAt, "Anglais");
    }
    _frenchLangs = string.Join(" ; ", languages);
    return _frenchLangs;
}

一行就能搞定

private string SortFrench(string langs)
{
    return string.Join(" ; ", langs.Split(';').Select(s => s.Trim())
                    .OrderBy(x => x != "Francais")
                    .ThenBy(x => x != "Anglais")
                    .ThenBy(x=>x));
}

按字母顺序排序很简单;在.ToArray()之前加入.OrderBy(s => s)。基于关键字的存在进行排序比较棘手。

快捷的方法是分成三个:

  • 包含"Francais"的字符串:.Where(s => s.Contains("Francais")
  • 包含"Anglais"的字符串:.Where(s => s.Contains("Anglais")
  • 其余:.Where(s => !francaisList.Contains(s) && !anglaisList.Contains(s))

然后您可以按字母顺序对它们进行排序,并将它们连接起来。

或者,您可以使用您描述的逻辑实现IComparer:

对于字符串A和B:

  • 如果A包含"Francais"
    • 如果B包含"Francais",按字母顺序排序
  • 其他
    • 如果B包含"Francais",则B优先
    • 其他
      • 如果A中包含"Anglais"
        • 如果B中包含"Anglais",按字母顺序排序
        • 否则,A优先
      • 其他,按字母顺序排列

可能有逻辑重组的空间来简化它。将所有这些逻辑包装在实现IComparer的类中,您可以指定该类供.OrderBy()使用,使其根据您的自定义逻辑对查询结果排序。

您也可以使用Array.Sort(yourStringArray)

下面的代码创建一个语言列表,使用自定义比较器对它们进行排序,然后将排序后的列表放回一起:

        const string langs = "foo;bar;Anglais;Francais;barby;fooby";
        var langsList = langs.Split(';').ToList();
        langsList.Sort((s1, s2) =>
            {
                if (s1 == s2)
                    return 0;
                if (s1 == "Francais")
                    return -1;
                if (s2 == "Francais")
                    return 1;
                if (s1 == "Anglais")
                    return -1;
                if (s2 == "Anglais")
                    return 1;
                return s1.CompareTo(s2);
            });
        var sortedList = string.Join(";", langsList);
        Console.WriteLine(sortedList);

这样你就可以在前面设置任何单词列表:

private static string SortFrench(string langs, string[] setStartList)
{
    string _frenchLangs = String.Empty;
    List<string> list = langs.Split(';').Select(s => s.Trim()).ToList();
    list.Sort();
    foreach (var item in setStartList){
    if (list.Contains(item))
    {
        list.Remove(setFirst);
    }
   }
    List<string> tempList = List<string>();
    tempList.AddRange(setStartList);
    tempList.AddRange(list);
    list = tempList;
    _frenchLangs = string.Join(" ; ", list);
    return _frenchLangs;
}