2016-03-16 2 views
0

У меня есть 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 

Что можно сделать, чтобы достичь этого?

ОБНОВЛЕНИЕ: Я добавил новые данные для ясности. Результат, полученный мной после реализации предложенного кода:


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 

ответ

1

Вы можете отсортировать данные по используемым объектам. Это немного больно, но вы можете попробовать код ниже?

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: Я смешал существующие данные из-за будучи уверенным в стабильности кода

Update: Это просто пример для ваших данных, пожалуйста, имейте в виду, вы должны изменить область OrderBy в соответствии с вашими данными разнообразие. Этот пример будет работать только для x.y и x формата данных.

Надеюсь, это поможет

+0

Хотя ваш код сказочный, он не работал должным образом. Выше показано только несколько образцов данных. Результатом после применения вашего кода было: '-1, 1.a, 1.b, 11.a, 12.a, 13.a, 2.a, 2.b и т. Д. – Skaranjit

+0

Я обновил свой вопрос. Пожалуйста, помиритесь – Skaranjit

+0

@Skaranjit, чтобы я получил его и обновил свой ответ, можете ли вы его проверить? –

Смежные вопросы