我有一个需要排序的分隔字符串。首先,我需要检查'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;
}
答案 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()
即可。基于关键字的存在进行排序比较棘手。
快速而肮脏的方式是分成三个:
.Where(s => s.Contains("Francais")
.Where(s => s.Contains("Anglais")
.Where(s => !francaisList.Contains(s) && !anglaisList.Contains(s))
然后你可以按字母顺序对每一个进行排序,并将它们连接起来。
或者,您可以使用您描述的逻辑实现IComparer
:
对于字符串A和B:
可能存在逻辑重新安排的空间以简化这一点。将所有逻辑包含在实现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);