Как сделать пользовательскую сортировку в списке - PullRequest
1 голос
/ 26 ноября 2010

У меня есть список, который состоит из следующих элементов

<1, 2-3, 4-5, >6

, когда я сортирую его, я получаю

<1,>6,2-3,4-5

, но хотел бы получить его в правильном порядке.

Я кодировал это, которое работает правильно, однако я нахожу его чрезвычайно многословным и хотел бы сократить его до 2,3 строк кода

_data.Sort(delegate(SourceEntity a1, SourceEntity a2)
{
  if (a1.Dimension1.StartsWith("<") && a2.Dimension1.StartsWith("<")) return 0;
  else if (a1.Dimension1.StartsWith(">") && a2.Dimension1.StartsWith(">")) return 0;
  else if (a1.Dimension1.StartsWith("<") && a2.Dimension1.StartsWith(">")) return -1;
  else if (a1.Dimension1.StartsWith(">") && a2.Dimension1.StartsWith("<")) return 1;
  else if (a1.Dimension1.StartsWith("<")) return -1;
  else if (a1.Dimension1.StartsWith(">")) return 1;
  else if (a2.Dimension1.StartsWith("<")) return 1;
  else if (a2.Dimension1.StartsWith(">")) return -1;
  else return a1.Dimension1.CompareTo(a2.Dimension1);
});

SourceEntity содержит свойство под названием Dimension1, котороесодержит значение, которое я пытаюсь отсортировать.

Ответы [ 3 ]

0 голосов
/ 26 ноября 2010

Кажется, единственный случай, когда лексическая сортировка не делает то, что вам нужно, это сравнение "<" с числом.Итак, следующего должно быть достаточно: </p>

return ((a1.Dimension1.StartsWith("<") && !a2.Dimension1.StartsWith("<"))
    ? -1 : a1.Dimension1.CompareTo(a2.Dimension1));
0 голосов
/ 27 ноября 2010
 var trimChars = new[] { '<', '>' };

 _data.Sort((a1, a2) => 
      a1.Dimension1.TrimStart(trimChars)
        .CompareTo(a2.Dimension1.TrimStart(trimChars)));
0 голосов
/ 26 ноября 2010

Вы можете использовать регулярное выражение, чтобы отфильтровать нечисловые символы, а затем сравнить:

_data.Sort(delegate(SourceEntity a1, SourceEntity a2)
{
    Regex nonNumericCharacters = new Regex(@"\D");
    return nonNumericCharacters.Replace(a1.Dimension1, string.Empty).CompareTo(nonNumericCharacters.Replace(a2.Dimension1, String.Empty));
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...