2016-11-17 2 views
-1

У меня есть список, содержащий данные со строкой и числом. Я должен заказать его в порядке возрастания и убывания.C# Сортировать по строке вместе с int и специальными символами

 id data 
    ------------------ 
     1  [email protected]% 
     2  data10 
     3  data 
     4  @$data 
     5  data2 

Я беру запись и храните ее в списке «Список». Затем я заказываю его по возрастанию, но «data10» идет в ч/б «data1» и «data2». Ниже приведен мой код

var o/p = List.OrderBy(x => x.data); 

ожидаемый выход - стандартный формат по возрастанию.

+1

Вам нужно буквенно-цифровой сортировки не –

+3

Возможные дубликата [буквенно-цифровой сортировки с помощью LINQ] (http://stackoverflow.com/questions/5093842/alphanumeric-sorting-using-linq) – Martheen

+0

Существует нет «стандартный» формат по возрастанию. Вы можете использовать параметр [compareType] (https://msdn.microsoft.com/en-us/library/system.stringcomparison (v = vs.110) .aspx) для параметра [String.Compare] (https: // msdn.microsoft.com/en-us/library/e6883c06(v=vs.110).aspx), чтобы указать конкретное сравнение. –

ответ

2

Как бой это, скопированный из this Где список является переменной List.

var result = list.OrderBy(x => Regex.Replace(x, "[0-9]+", match => match.Value.PadLeft(10, '0'))); 

enter image description here

+0

Хорошо, я полагаю, это работает все числовые сценарии Alpha +1, однако при копировании с другого ответа попробуйте добавить свое собственное объяснение –

0

Разработка версии коды с данными испытаний, используя PInvoke, это стандартная буквенно-цифровая сортировка, обеспечивается Win32, который очень быстро (используйте код LINQPad)

void Main() 
{ 
    List<Test> test = Test.FetchList(); // Fetch Data 

    test.Sort(new AlphaNumericSorter()); // Sorting using Win32 StrCmpLogicalW 

    test.Dump(); // Print Result 
} 

// Define other methods and classes here 
public class AlphaNumericSorter : IComparer<Test> 
{ 
    public int Compare(Test x, Test y) 
    { 
     return SafeNativeMethods.StrCmpLogicalW(x.Data, y.Data); 
    } 
} 

[SuppressUnmanagedCodeSecurity] 
internal static class SafeNativeMethods 
{ 
    [DllImport("shlwapi.dll", CharSet = CharSet.Unicode)] 
    public static extern int StrCmpLogicalW(string psz1, string psz2); 
} 

public class Test 
{ 
    public int Id { get; set;} 

    public string Data { get; set;} 

    public static List<Test> FetchList() 
    { 
     var returnList = new List<Test>(); 

     returnList.Add(new Test { Id = 1, Data = "[email protected]%"}); 
     returnList.Add(new Test { Id = 2, Data = "data10"}); 
     returnList.Add(new Test { Id = 3, Data = "data"}); 
     returnList.Add(new Test { Id = 4, Data = "@$data"}); 
     returnList.Add(new Test { Id = 5, Data = "data2"}); 

     return (returnList); 
    } 

} 

enter image description here

Пожалуйста, обратите внимание:

  • Если вам нужна пользовательская/нестандартная сортировка, вам необходимо определить работу Aplha-numeric s Orting, это один использовать стандартный API
Смежные вопросы