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;
}
有人喜欢我的评论,所以我想我应该把它转换成你的代码:
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优先
- 其他,按字母顺序排列
- 如果A中包含"Anglais"
可能有逻辑重组的空间来简化它。将所有这些逻辑包装在实现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;
}