C# 按字母顺序对字符串数组进行排序,注意将以大写字母开头的字符串放在首位。第一的
C# Sort string array alphabetically taking care of putting strings which start with capital letter first. first
1) 有一个 Kata 规定对字符串数组中的所有字符串进行排序,然后取第一个单词并在每个字母之间添加 ***:https://www.codewars.com/kata/sort-and-star
2) 例如:
(1) 给出:
bitcoin
take
over
the
world
maybe
who
knows
perhaps
(2) 订购后:
bitcoin
knows
maybe
over
perhaps
take
the
who
world
(3) return 结果是:
b***i***t***c***o***i***n
3) 但是我面临的困难如下:我们如何表达 'order first the words which start with capital letter'?
4) 我试过下面的代码:
using System;
public class Kata
{
public static string TwoSort(string[] s)
{
foreach(string str in s){
Console.WriteLine(str);
}
Console.WriteLine("");
Array.Sort(s);
foreach(string str in s){
Console.WriteLine(str);
}
Console.WriteLine("");
string firstWord = s[0];
string result = "";
foreach(char letter in firstWord){
result += letter + "***";
}
Console.WriteLine(result.Substring(0, result.Length - 3));
return result.Substring(0, result.Length - 3);
}
}
5) 例如:
(1) 给出如下数组:
Lets
all
go
on
holiday
somewhere
very
cold
(2) 订购后:
all
cold
go
holiday
Lets
on
somewhere
very
(3) 当前错误结果:
a***l***l
(4) 预期正确结果:
L***e***t***s
我也看过:
how to sort a string array by alphabet?
Sorting an array alphabetically in C#
您应该指定比较器,例如(Linq解决方案):
string[] source = new string[] {
"Lets",
"all",
"go",
"on",
"holiday",
"somewhere",
"very",
"cold",
};
// StringComparer.Ordinal: order by Ascii values; capital letters < small letters
var ordered = source
.OrderBy(item => item, StringComparer.Ordinal);
Console.Write(string.Join(", ", ordered));
结果:
Lets, all, cold, go, holiday, on, somewhere, very
为了获得想要的结果(如果您坚持要订购),您可以输入
var result = string.Join("***", source
.OrderBy(item => item, StringComparer.Ordinal)
.First()
.Select(c => c)); // <- turn string into IEnumerable<char>
Console.Write(result);
结果:
L***e***t***s
如果您想继续使用当前代码,请将 Array.Sort(s);
更改为
Array.Sort(s, StringComparer.Ordinal);
您可以指定 Ordinal 字符串比较器将结果先大写再小写。
Array.Sort(s, StringComparer.Ordinal);
如果是Class Feature like "Name", 可以使用下面的
if (isAscend)
List1.Sort((x, y) => x.Name.CompareTo(y.Name));
else
List1.Sort((x, y) => -x.Name.CompareTo(y.Name));
您可以获得按“名称”排序的 Class 列表。
1) 有一个 Kata 规定对字符串数组中的所有字符串进行排序,然后取第一个单词并在每个字母之间添加 ***:https://www.codewars.com/kata/sort-and-star
2) 例如:
(1) 给出:
bitcoin
take
over
the
world
maybe
who
knows
perhaps
(2) 订购后:
bitcoin
knows
maybe
over
perhaps
take
the
who
world
(3) return 结果是:
b***i***t***c***o***i***n
3) 但是我面临的困难如下:我们如何表达 'order first the words which start with capital letter'?
4) 我试过下面的代码:
using System;
public class Kata
{
public static string TwoSort(string[] s)
{
foreach(string str in s){
Console.WriteLine(str);
}
Console.WriteLine("");
Array.Sort(s);
foreach(string str in s){
Console.WriteLine(str);
}
Console.WriteLine("");
string firstWord = s[0];
string result = "";
foreach(char letter in firstWord){
result += letter + "***";
}
Console.WriteLine(result.Substring(0, result.Length - 3));
return result.Substring(0, result.Length - 3);
}
}
5) 例如:
(1) 给出如下数组:
Lets
all
go
on
holiday
somewhere
very
cold
(2) 订购后:
all
cold
go
holiday
Lets
on
somewhere
very
(3) 当前错误结果:
a***l***l
(4) 预期正确结果:
L***e***t***s
我也看过:
how to sort a string array by alphabet?
Sorting an array alphabetically in C#
您应该指定比较器,例如(Linq解决方案):
string[] source = new string[] {
"Lets",
"all",
"go",
"on",
"holiday",
"somewhere",
"very",
"cold",
};
// StringComparer.Ordinal: order by Ascii values; capital letters < small letters
var ordered = source
.OrderBy(item => item, StringComparer.Ordinal);
Console.Write(string.Join(", ", ordered));
结果:
Lets, all, cold, go, holiday, on, somewhere, very
为了获得想要的结果(如果您坚持要订购),您可以输入
var result = string.Join("***", source
.OrderBy(item => item, StringComparer.Ordinal)
.First()
.Select(c => c)); // <- turn string into IEnumerable<char>
Console.Write(result);
结果:
L***e***t***s
如果您想继续使用当前代码,请将 Array.Sort(s);
更改为
Array.Sort(s, StringComparer.Ordinal);
您可以指定 Ordinal 字符串比较器将结果先大写再小写。
Array.Sort(s, StringComparer.Ordinal);
如果是Class Feature like "Name", 可以使用下面的
if (isAscend)
List1.Sort((x, y) => x.Name.CompareTo(y.Name));
else
List1.Sort((x, y) => -x.Name.CompareTo(y.Name));
您可以获得按“名称”排序的 Class 列表。