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

时间:2013-05-15 14:05:44

标签: 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;
    }

9 个答案:

答案 0 :(得分: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);
}

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

答案 1 :(得分:6)

您应该使用custom comparer

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

答案 2 :(得分:5)

这就是我想出的。您可以在选择后更改.Sort()的{​​{1}},但我觉得它更干净。

OrderBy(lang => lang)

答案 3 :(得分:3)

试试这个:

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

答案 4 :(得分:2)

所有都可以单行完成

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

答案 5 :(得分:0)

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

快速而肮脏的方式是分成三个:

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

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

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

对于字符串A和B:

  • 如果A包含&#34; Francais&#34;
    • 如果B包含&#34; Francais&#34;,则按字母顺序排列
  • 否则
    • 如果B包含&#34; Francais&#34;,B先出现
    • 否则
      • 如果A包含&#34; Anglais&#34;
        • 如果B包含&#34; Anglais&#34;,则按字母顺序排列
        • 否则,A先行
      • 否则,按字母顺序排列

可能存在逻辑重新安排的空间以简化这一点。将所有逻辑包含在实现IComparer的类中,您可以指定该类供.OrderBy()使用,以使其根据您的自定义逻辑对您的查询结果进行排序。

答案 6 :(得分:0)

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

答案 7 :(得分:0)

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

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

答案 8 :(得分:0)

此代码创建语言列表,使用自定义比较器对它们进行排序,然后将排序后的列表重新组合在一起:

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