在 C# 中排列 AlphaNumeric 字符串列表
Arranging a list of AlphaNumberic string in c#
我有一个字母数字字符串列表,如下所示:
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
等等。
谁能告诉我如何对此进行排序。
谢谢
您需要像这样实现自己的 IComparer<string>
:
public class MyComparer : IComparer<String>
{
public int Compare(string x, string y)
{
// your comparing logic
}
}
然后您可以这样对列表进行排序:
List<string> myStrings = // wherever you get them
myString.Sort(new MyComparer());
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;
}
这只是一个建议,肯定可以改进。如果字符串的格式不总是正确的,首先通过一些错误处理。
Compare
的标准是
- 如果
x
小于y
return -1
- 如果
x
大于 y
return 1
- 如果
x
等于 y
return 0
与"smaller"、"greater"和"equal"根据您的要求排序。
如果你所有的版本都有这样的模板"V{number}_{Year}"你可以使用这个代码
List<string> Versions = new List<string>();
// Fill Versions
Versions = Versions.OrderBy(V => Convert.ToInt32(V.Split('_')[1]))
.ThenBy(V => Convert.ToInt32(V.Split('_')[0].Remove(0, 1)))
.ToList();
您也可以使用 LINQ 查询对其进行排序,因此您需要拆分值并将标记解析为 int
:
int version = 0, year = 0;
IEnumerable<string> orderedByYearAndVersion = values
.Select(v => new { value = v, tokens = v.Split('_') })
.Where(x => x.tokens.Length == 2
&& x.tokens[0].StartsWith("v")
&& int.TryParse(x.tokens[0].Substring(1), out version)
&& int.TryParse(x.tokens[1], out year))
.Select(x => new { x.value, version, year })
.OrderBy(x => x.year)
.ThenBy(x => x.version)
.Select(x => x.value);
但一般来说,最好创建具有 int Year
和 int Version
等属性的自定义 class。然后你可以实现 IComparable
和像 List.Sort
这样的方法自动工作。
我有一个字母数字字符串列表,如下所示:
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
等等。
谁能告诉我如何对此进行排序。 谢谢
您需要像这样实现自己的 IComparer<string>
:
public class MyComparer : IComparer<String>
{
public int Compare(string x, string y)
{
// your comparing logic
}
}
然后您可以这样对列表进行排序:
List<string> myStrings = // wherever you get them
myString.Sort(new MyComparer());
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;
}
这只是一个建议,肯定可以改进。如果字符串的格式不总是正确的,首先通过一些错误处理。
Compare
的标准是
- 如果
x
小于y
return-1
- 如果
x
大于y
return 1 - 如果
x
等于y
return 0
与"smaller"、"greater"和"equal"根据您的要求排序。
如果你所有的版本都有这样的模板"V{number}_{Year}"你可以使用这个代码
List<string> Versions = new List<string>();
// Fill Versions
Versions = Versions.OrderBy(V => Convert.ToInt32(V.Split('_')[1]))
.ThenBy(V => Convert.ToInt32(V.Split('_')[0].Remove(0, 1)))
.ToList();
您也可以使用 LINQ 查询对其进行排序,因此您需要拆分值并将标记解析为 int
:
int version = 0, year = 0;
IEnumerable<string> orderedByYearAndVersion = values
.Select(v => new { value = v, tokens = v.Split('_') })
.Where(x => x.tokens.Length == 2
&& x.tokens[0].StartsWith("v")
&& int.TryParse(x.tokens[0].Substring(1), out version)
&& int.TryParse(x.tokens[1], out year))
.Select(x => new { x.value, version, year })
.OrderBy(x => x.year)
.ThenBy(x => x.version)
.Select(x => x.value);
但一般来说,最好创建具有 int Year
和 int Version
等属性的自定义 class。然后你可以实现 IComparable
和像 List.Sort
这样的方法自动工作。