[英]sorting a field of datatable which have special character
我有一个datatable
具有我从一个表中一个访问数据库填充一些列。 我有一个特殊的列是SN,它包含如下数据:
SN
_____
-1
1.a
1.a
1.b
10
1000
1001
1002
11.a
11.b
13.a
2.a
2.b
2.c
2000
2001
21.a
22.b
3.a
3.b
3.c
4000
4001
4.a
SN字段为字符串格式,当我对数据进行排序时,结果如上所示。
但是我想在这里得到的是排序列,我希望是这样的:
SN
_____
-1
1.a
1.a
1.b
2.a
2.b
2.c
3.a
3.b
3.c
4.a
10
11.a
11.b
13.a
21.a
22.b
1000
1001
1002
2000
2001
4000
4001
要做到这一点怎么办?
更新:为清楚起见,我添加了nore数据。 在实施建议的代码后获得的结果是:
SN
_____
-1
1.a
1.a
1.b
10
11.a
11.b
13.a
2.a
2.b
2.c
21.a
22.b
3.a
3.b
3.c
4.a
1000
1001
1002
2000
2001
4000
4001
您可以使用可枚举的功能对数据表进行排序。 这有点痛苦,但是您可以尝试下面的代码吗?
DataTable myDataTable = new DataTable();
myDataTable.Columns.Add("SN", typeof(string));
//string myValues = "-1;1.a;1.b;10;1000;1001;1002;2.c;2.b;2.a;2000;2001;3.a;3.b;3.c;4000;4001;4.a;1.a";
string myValues = "a;a.b;c.c;-1;1.a;1.a;1.b;10;11.a;11.b;13.a;2.a;2.b;2.c;21.a;22.b;3.a;3.b;3.c;4.a;1000;1001;1002;2000;2001;4000;4001";
string[] myValuesArray = myValues.Split(';');
foreach (string myValue in myValuesArray)
{
DataRow myRow = myDataTable.NewRow();
myRow["SN"] = myValue;
myDataTable.Rows.Add(myRow);
}
string beforeSort = string.Join(";", myDataTable.AsEnumerable().Select(x => x["SN"]));
Console.WriteLine("Before Sorting:");
Console.WriteLine(beforeSort);
IEnumerable<DataRow> sortedValues = myDataTable.AsEnumerable()
.OrderBy(x =>
{
string currentStringValue = x["SN"].ToString();
string[] currentStringValueArray = currentStringValue.Split('.');
if (currentStringValueArray.Length == 2)
{
string currentPart = "";
int currentPartNumeric = 0;
if (int.TryParse(currentStringValueArray[0], out currentPartNumeric))
{
currentPart += currentPartNumeric.ToString();
}
else
{
//We are assuming our alphanumeric chars are integers
currentPart += (((int)(char.ToUpper(char.Parse(currentStringValueArray[0])))) - 64).ToString();
}
if (int.TryParse(currentStringValueArray[1], out currentPartNumeric))
{
currentPart += "." + currentPartNumeric.ToString();
}
else
{
//We are assuming our alphanumeric chars are integers
currentPart += "." + (((int)(char.ToUpper(char.Parse(currentStringValueArray[1])))) - 64).ToString();
}
return Convert.ToDecimal(currentPart, CultureInfo.InvariantCulture);
}
else if (currentStringValueArray.Length == 1)
{
int currentPartNumeric = 0;
string currentPart = "";
if (int.TryParse(currentStringValueArray[0], out currentPartNumeric))
{
currentPart += currentPartNumeric.ToString();
}
else
{
//We are assuming our alphanumeric chars are integers
currentPart += "." + (((int)(char.ToUpper(char.Parse(currentStringValueArray[0])))) - 64).ToString();
}
return Convert.ToDecimal(currentPart, CultureInfo.InvariantCulture);
}
else
return 0m;
});
string afterSort = string.Join(";", sortedValues.Select(x => x["SN"]));
Console.WriteLine("After Sorting:");
Console.WriteLine(afterSort);
//Copy to your existing datatable
myDataTable = sortedValues.CopyToDataTable();
PS:由于确定代码的稳定性,我混合了您现有的数据
更新:这只是数据的一个示例,请记住,您应该根据数据的多样性来修改OrderBy范围。 该示例仅适用于xy和x格式的数据。
希望这可以帮助
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.