san*_*ify 0 c# sorting collections list alphanumeric
我有一个字母数字字符串列表,如下所示:
v1_2014
.
我的这些值范围从v1
以v53
从一年2014
到2016
.我想他们在这个顺序排列v1_2014
来v53_2014
,v1_2015
来v53_2015
等等.
当我尝试对列表进行排序时,返回的顺序是
v1_2014, v1_2015,v1_2016, v10_2014, v10_2015, ... ,v2_2014,v2_2015,v2_2016,v20_2014
Run Code Online (Sandbox Code Playgroud)
等等.
有人可以给我一个关于如何对此进行排序的想法.谢谢
你需要实现这样的自己IComparer<string>
:
public class MyComparer : IComparer<String>
{
public int Compare(string x, string y)
{
// your comparing logic
}
}
Run Code Online (Sandbox Code Playgroud)
然后你可以像这样排序你的列表:
List<string> myStrings = // wherever you get them
myString.Sort(new MyComparer());
Run Code Online (Sandbox Code Playgroud)
可能的实现MyComparer.Compare
可能如下所示:
public int Compare(string x, string y)
{
string[] xpart = x.Split('_');
int x1 = int.Parse(xpart[0].Trim('v'));
int x2 = int.Parse(xpart[1]);
string[] ypart = y.Split('_');
int y1 = int.Parse(ypart[0].Trim('v'));
int y2 = int.Parse(ypart[1]);
if (x2 < y2) return -1;
if (x2 > y2) return 1;
if (x1 < y1) return -1;
if (x1 > y1) return 1;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这只是一个肯定可以改进的建议.首先通过一些错误处理,如果字符串不总是很好地形成.
标准Compare
是
x
小于y
返回-1
x
大于y
返回1x
等于y
返回0根据您的要求排序,"更小","更大"和"相等".