C#中的字母数字排序
作者:互联网
我有这样的CSV数据:
数;版本
1; AA.1
1; A01.1
1; A01.2
1; Z.7
在这里,我需要按如下方式对Version列进行排序:
数;版本
1; AA.1
1; Z.7
1; A01.2
1; A01.1
所以如果你看到,Z.7条目应该在AA.1之后.基本上降序排序应该像:
分类版本:
BB
AA
ž
C
乙
一个
我已经试过了
也在http://www.DaveKoelle.com讨论了Alphanum算法
自然排序比较器
http://www.codeproject.com/Articles/22517/Natural-Sort-Comparer.除了上面提到的排序,它做了我想要的一切.
解决方法:
因此,看起来您需要对CSV文件中的一些自定义逻辑进行排序.要执行此操作,您必须实现IComparer< string>在一个类上,根据您的要求实现Compare
方法.看起来在你的情况下,你需要首先将字符串分成两部分,字母表部分和数字部分(使用正则表达式),然后首先比较字符串,如果两者相同则比较数字部分并相应地返回值.
然后,您可以使用此Comparer类对它们进行排序.
更新
代码示例
public class CustomStringComparer : IComparer<string>
{
public int Compare(string x, string y)
{
int? result;
if (AnyParamIsNull(x, y, out result))
{
return result.Value;
}
string x1, y1;
double x2, y2;
SplitInput(x, out x1, out x2);
SplitInput(y, out y1, out y2);
if (x1.Length == y1.Length)
{
result = string.Compare(x1, y1);
if (result.Value == 0)
{
if (x2 < y2)
{
return -1;
}
else if (x2 > y2)
{
return 1;
}
else
{
return 0;
}
}
else
{
return result.Value;
}
}
else
{
//To make AA before Z when desending
return x1.Length - y1.Length;
}
}
private bool SplitInput(string input, out string alphabets, out double number)
{
Regex regex = new Regex(@"\d*[.]?\d+");
Match match = regex.Match(input);
if (match.Success)
{
number = double.Parse(match.Value, CultureInfo.InvariantCulture);
alphabets = input.Replace(match.Value, "");
return true;
}
else
{
throw new ArgumentException("Input string is not of correct format", input);
}
}
private bool AnyParamIsNull(string x, string y, out int? result)
{
result = null;
if (x == null)
{
if (y == null)
{
// If x is null and y is null, they're
// equal.
result = 0;
return true;
}
else
{
// If x is null and y is not null, y
// is greater.
result = -1;
return true;
}
}
else
{
// If x is not null...
//
if (y == null)
// ...and y is null, x is greater.
{
result = 1;
return true;
}
}
return false;
}
}
使用此Comparer
List<string> input = new List<string>()
{
"AA.1",
"A01.1",
"A01.2",
"Z.7"
};
input.Sort(new CustomStringComparer());
//To sort decending
input.Reverse();
注意:我已经证明上面的代码是正确的,否则没有.可能存在一些可能无法按预期工作的边缘情况
标签:c,algorithm,sorting,alphanumeric 来源: https://codeday.me/bug/20190629/1331051.html