从字母数字到非字母数字排序
本文关键字:数字 排序 | 更新日期: 2023-09-27 17:49:36
我有一个数据数组:
!
A
B
E
$
N
我希望它从字母数字到非字母数字排序。
示例:A B E N ! $
我该如何完成这项工作?
char[] yourOriginalValues = new [] { '!', 'A', 'B', 'E', '$', 'N' };
IEnumerable<char> result =
yourOriginalValues.Where(c => Char.IsLetterOrDigit(c))
.OrderBy(c => c)
.Concat(yourOriginalValues.Where(c => !Char.IsLetterOrDigit(c)));
这似乎产生了你想要的价值观。
这可以通过OrderBy和ThenBy扩展方法的组合来实现:
char[] data = { 'E', 'B', '$', 'N', '!', 'A' };
var query = data.OrderByDescending(c => char.IsLetter(c))
.ThenBy(c => c);
如果您想要自定义排序顺序,您需要提供自己的比较功能。在您的情况下(先是字母+数字,后是其他数字(,您可以使用类似的东西
var data = "!ABE$N".ToCharArray().ToList();
data.Sort((x, y) => {
if (x == y) return 0;
if (Char.IsLetterOrDigit(x))
{
if (!Char.IsLetterOrDigit(y)) return -1;
return x < y ? -1 : +1;
}
else
{
if (Char.IsLetterOrDigit(y)) return +1;
return x < y ? -1 : +1;
}
});
添加每个注释:相同的东西,只是有不同的语法(使用一个简单的旧命名方法(:
int MyComparisonFunction(char x, char y)
{
if (x == y) return 0;
if (Char.IsLetterOrDigit(x))
{
if (!Char.IsLetterOrDigit(y)) return -1;
return x < y ? -1 : +1;
}
else
{
if (Char.IsLetterOrDigit(y)) return +1;
return x < y ? -1 : +1;
}
}
// ...
var data = "!ABE$N".ToCharArray().ToList();
data.Sort(MyComparisonFunction);
在另一种风格中,同样的事情是创建一个IComparer实现并使用它。如果排序顺序应该在更多的地方使用,这是有用的,许多集合和控件提供了一个IComparer属性来覆盖排序顺序:
public class AlphabeticPriorToNonalphabeticComparer : IComparer<char>
{
public int Compare(char x, char y)
{
if (x == y) return 0;
if (Char.IsLetterOrDigit(x))
{
if (!Char.IsLetterOrDigit(y)) return -1;
return x < y ? -1 : +1;
}
else
{
if (Char.IsLetterOrDigit(y)) return +1;
return x < y ? -1 : +1;
}
}
}
// ...
var data = "!ABE$N".ToCharArray().ToList();
var myComparer = new AlphabeticPriorToNonalphabeticComparer();
data.Sort(myComparer);
myArray.Sort();
这将使用默认的字母(非数字(排序。这应该有效,还是我遗漏了什么?