[英]Int.Parse and Sorting
我有以下代码。
var strings = new[] {
"FD1","FD5","FD10","FD102","FD105","FD10","FD32","FD80", "FD31", "FD21", "FDnon"
};
strings = strings.Select(str => new
{
str,
num = int.Parse(String.Concat(str.Trim('F', 'D'))),
})
.OrderBy(x => x.num)
.Select(x => x.str)
.ToArray();
但是,当它到达“ FDnon”时,此操作将失败,因为其中没有数字,
如何与顶部排列的“ FDnon”一起使用?
如果要自定义订购,请提供自定义SortMethod
var sorted = strings
.OrderBy(SpecialSort)
.ToList();
public static int SpecialSort(string value)
{
int sortOrder = 0;
string numberPart = value.Trim('F', 'D');
int.TryParse(numberPart, out sortOrder);
return sortOrder;
}
编辑:更改解决方案以解决字符串中的数字排序。
var result = strings.OrderBy(x =>
{
int y = int.MinValue;
int.TryParse(x.Substring(2), out y);
return y;
});
如果希望FDnon出现在顶部,则可以使用以下方法:
strings = strings.Select(str => new
{
str,
num = str=="FDnon" ? Int32.MaxValue : Int32.Parse(String.Concat(str.Trim('F', 'D')))
})
.OrderBy(x => x.num)
.Select(x => x.str)
.ToArray();
此代码仅跳过FDnon
转换。 如果要允许其他值,则应在要接受的内容上更具体。
您需要一个更复杂的解析,将FDnon
转换为将最后排序的整数值(在这种情况下, Int32.MaxValue
可以)。
就像是:
var res = strings.Select(s => {
var numPart = s.Trim('F', 'D');
var i;
if (!Int32.TryParse(numPart, out i)) {
i = Int32.MaxValue;
}
return new {
str = s,
num = i
};
}.OrderBy …
如果字符串始终以两个字母开头,则也可以使用Substring(2)
。 要检查是否有数字部分,可以使用Enumerable.All(Char.IsDigit)
(假定所有字符都是前两个小写字母后面的数字):
strings = strings.Select(str => new
{
str,
num = str.Substring(2).All(Char.IsDigit) ? int.Parse(str.Substring(2)) : int.MinValue
})
.OrderBy(x => x.num)
.Select(x => x.str)
.ToArray();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.