我目前有一个字符串列表,需要在不考虑以下字符的情况下排序('.', ',', '-', '\'')
示例
var cities = new List<string>()
{
"Aigle ",
"Bulle",
"La Chaux-de-Fonds",
"L'Abbaye",
"Malleray",
"Sierre",
"S. City",
"St-Aubin",
"St-Cergue",
"St-Gingolph",
"St-Légier-La Chiesaz",
"St-Maurice",
"St-Sulpice",
"St-Sulpice",
"Staad"
};默认下订单
var ordered = cities
.OrderBy(x => x)
.ToList();输出
"Aigle"
"Bulle"
"La Chaux-de-Fonds"
"L'Abbaye"
"Malleray"
"S. City"
"Sierre"
"Staad"
"St-Aubin"
"St-Cergue"
"St-Gingolph"
"St-Légier-La Chiesaz"
"St-Maurice"
"St-Sulpice"
"St-Sulpice"我想要的输出必须是这样。
"Aigle "
"Bulle"
"L'Abbaye"
"La Chaux-de-Fonds"
"Malleray"
"S. City"
"Sierre"
"St-Aubin"
"St-Cergue"
"St-Gingolph"
"St-Légier-La Chiesaz"
"St-Maurice"
"St-Sulpice"
"St-Sulpice"
"Staad"我通过这样做得到了我想要的输出。
var ordered = cities
.OrderBy(x => x.Replace(".", " ").Replace("-", " ").Replace("'", " "))
.ToList();我真的不知道我在做什么是否可以。
还有其他方法可以得到预期的结果吗?
发布于 2019-08-06 14:15:12
也许一个转变可以帮助你
var ordered = cities
.Select(city => new { Name = city, NameForOrdering = string.Join(string.Empty, city.Where(c => Char.IsLetterOrDigit(c)).ToArray()) })
.OrderBy(city => city.NameForOrdering)
.Select(city => city.Name)
.ToList();这可以作为一种快速而肮脏的方法来帮助您通过一个障碍或测试一些东西,但是真正的解决方案是使用OrderBy的第二个重载,它需要您的自定义相等性比较-r。
发布于 2019-08-06 14:35:30
好的,我们只能通过字母订购(我们忽略,即删除所有非字母字符):
var ordered = cities
.OrderBy(city => string.Concat(city.Where(c => char.IsLetter(c))),
StringComparer.CurrentCultureIgnoreCase)
.ToList();
// Let's have a look
Console.Write(string.Join(Environment.NewLine, ordered));我们会收到以下订单
Aigle
Bulle
L'Abbaye
La Chaux-de-Fonds
Malleray
S. City
Sierre
Staad
St-Aubin
St-Cergue
St-Gingolph
St-Légier-La Chiesaz
St-Maurice
St-Sulpice
St-Sulpice如果要将所有非字母视为空格' ' (当前代码):
var ordered = cities
.OrderBy(city => string.Concat(city.Select(c => char.IsLetter(c) ? c : ' ')),
StringComparer.CurrentCultureIgnoreCase)
.ToList();命令将是
Aigle
Bulle
L'Abbaye
La Chaux-de-Fonds
Malleray
S. City
Sierre
St-Aubin
St-Cergue
St-Gingolph
St-Légier-La Chiesaz
St-Maurice
St-Sulpice
St-Sulpice
StaadStaad定位中订单的差异
发布于 2019-08-06 15:40:11
一种在忽略指定字符的同时对列表进行排序的方法,方法是替换需要忽略的字符。
例如,对于字符串cities的列表
var cities = new List<string>()
{
"Aigle ",
"Bulle",
"La Chaux-de-Fonds",
"L'Abbaye",
"Malleray",
"Sierre",
"S. City",
"St-Aubin",
"St-Cergue",
"St-Gingolph",
"St-Légier-La Chiesaz",
"St-Maurice",
"St-Sulpice",
"St-Sulpice",
"Staad"
};选项1:不使用Regex
var charList = new List<char>{'.', ',', '-', '\''};
var result = cities.OrderBy(x => charList.Aggregate(x, (c1, c2) => c1.Replace(c2, ' '))).ToArray();选项2:使用Regex.
var charList = new List<char>{'.', ',', '-', '\''};
var regex = new Regex($"[{string.Join("",charList.OrderBy(x=>x))}]*");
var result = cities.OrderBy(x=> regex.Replace(x," "));输出
Aigle
Bulle
L'Abbaye
La Chaux-de-Fonds
Malleray
S. City
Sierre
St-Aubin
St-Cergue
St-Gingolph
St-Légier-La Chiesaz
St-Maurice
St-Sulpice
St-Sulpice
Staad https://stackoverflow.com/questions/57378024
复制相似问题