2016-01-08 3 views
0

У меня есть текстовый список, и я хочу создать обычную логику сравнения для сортировки этих списков с помощью C#. Например.Как создать собственный общий сопоставитель число-текст в C# для сортировки числового/строкового списка?

var numericList = new List<string>{"100", "--", "-0.98", "N/A", "0.00", "-888"}; 
var stringList = new List<string> {"Smith", "--", "Peter", "", "Jim", "Ken", "NA"}; 

, который содержит специальные символы, такие как -, N/A, пространство и т.д. И ожидаемый результат после того, как-то будет - Для NemericList возрастанию -> N/A, -, -888, - 0,98, 0,00, 100 Для StringList возрастанию -> Джим, Кен, N/A, Питер Смит, Empty, -

я создал следующие пользовательские компаратор логики, которая делает некоторый уровень сортировки, но не соответствие с ожидаемый результат. Пожалуйста, предложите мне способ добиться этого.

public class NumberTextComparer : IComparer<string> 
    { 
     public int Compare(string s1, string s2) 
     { 
      double number1, number2; 
      var isS1Numeric = double.TryParse(s1, out number1); 
      var isS2Numeric = double.TryParse(s2, out number2); 

      if (isS1Numeric && isS2Numeric) 
      { 
       if (number1 > number2) return 1; 
       if (number1 < number2) return -1; 
       return 0; 
      } 

      return isS1Numeric ? 1 : (isS2Numeric ? -1 : String.Compare(s1, s2, StringComparison.OrdinalIgnoreCase)); 
     } 
    } 
var comparer = new NumberTextComparer(); 
var numericSortedListASC = numericList.OrderBy(str => str, comparer); 
var stringSortedListASC = stringList.OrderBy(str => str, comparer); 
+0

Что именно не работает о вашем сравнении? – Matthew

+0

Порядок сортировки не выполняется в обеих ситуациях. –

+0

правильно, я имел в виду, что вы получаете и чего вы ожидаете? – Matthew

ответ

2

Ваш код работает правильно. Se here. Результаты:

--, N/A, -888, -0.98, 0.00, 100 
, --, Jim, Ken, NA, Peter, Smith 

Проблема заключается в вашем предположении, что буквы «» и «-» появляются после букв. Поскольку они имеют более низкое положение в ascii-table, они на первом месте.

Это было бы простым решением. Попробуйте here

public int Compare(string s1, string s2) 
    { 
     double number1, number2; 
     var isS1Numeric = double.TryParse(s1, out number1); 
     var isS2Numeric = double.TryParse(s2, out number2); 

     if (isS1Numeric && isS2Numeric) 
     { 
      if (number1 > number2) return 1; 
      if (number1 < number2) return -1; 
      return 0; 
     } 
     if (isS1Numeric) 
      return 1; 
     if (isS2Numeric) 
      return -1; 

     bool s1StartsWithLetter = char.IsLetter(s1.FirstOrDefault()); 
     bool s2StartsWithLetter = char.IsLetter(s2.FirstOrDefault()); 

     if (s1StartsWithLetter == s2StartsWithLetter) 
      return String.Compare(s1, s2, StringComparison.OrdinalIgnoreCase); 
     return s1StartsWithLetter ? -1 : 1; 
    } 
+0

Спасибо большое! За ваше предложение и это работает :) –