2017-02-06 1 views
1

Я получил этот код в контроллере asp.net mvc3 для просмотра и заказа в выпадающем списке. Но моя проблема, как вы можете видеть на картинке ниже, ее заказ text and next to it the number. Как исправить эту проблему ?.Как исправить заказ?

ViewBag.AddrBarangay = new SelectList(db.Barangays, "BarangayId", "BarangayName", "").OrderBy(m => m.Text); 

enter image description here

+0

Можете ли вы, пожалуйста, дайте мне знать, номер вместе с текстом или отдельным столбцом? или вы объединяете оба? понимаете ли вы мою мысль? – Rajpurohit

+0

@ Rajpurohit это вместе с текстом. – KiRa

+0

Вы имеете в виду колонку «BarangayName», содержащую «Barangay 1», «Barangay 101»? – Rajpurohit

ответ

3

В вашем случае, вы должны создать новый Comparer, который может сортировать в lexicograhical order Вы должны иметь свою собственную реализацию компаратора, который реализует интерфейс IComparer<string>. Ваш Comparer должно быть так:

public class LexicoComparer : IComparer<string> 
{ 
    public int Compare(string x, string y) 
    { 
     var firstArgumentSplits = x.Split(' '); 
     var secondArgumentSplits = y.Split(' '); 

     if (firstArgumentSplits.Length == 2 && secondArgumentSplits.Length == 2) 
     { 
      int firstArgumentInt, secondArgumentInt; 
      if (firstArgumentSplits[0] == secondArgumentSplits[0]) 
      { 
       if (int.TryParse(firstArgumentSplits[1], out firstArgumentInt)) 
       { 
        if (int.TryParse(secondArgumentSplits[1], out secondArgumentInt)) 
        { 
         return firstArgumentInt == secondArgumentInt ? 0 : firstArgumentInt > secondArgumentInt ? 1 : 0; 
        } 

       } 
      } 
     } 


     return String.Compare(x, y); 
    } 
} 

Теперь вы используете выше компаратором в OrderBy:

ViewBag.AddrBarangay = new SelectList(db.Barangays, 
     "BarangayId", "BarangayName", "").OrderBy(m => m.Text, 
             new LexicoComparer()); 
+0

Почему он находится в порядке убывания? – KiRa

+0

Упс !!! Извините, хотя у меня был OrderBy, но я написал OrderByDescending. Исправлено –

+0

Получил ошибку (индекс был за пределами массива.), Если некоторые из моих данных не имеют числового или двухсловного текста. Пример 'Brgy1, Brgy2' будет работать в' Brgy1 1, Brgy1 2' Из-за строки 'int.TryParse (firstArgumentSplits [1]' – KiRa

2

Хотя ИМХО лучший способ решить эту проблему было бы хранить ценности, как 1,10,100 в SelectList значение собственности и затем его сортировать. Если по какой-то причине вы не можете этого сделать, вам необходимо предоставить таможню EqualityComparer в предложении OrderBy.

Кроме того, если ваш текст Barangay всегда будет оставаться постоянным, то вы можете сделать это таким образом, а также (хотя и не очень хороший подход, как это не общий): -

int maxSize = db.Barangays.Max(x => x.Text.Length); 
ViewBag.AddrBarangay = new SelectList(db.Barangays, "BarangayId", "BarangayName", "") 
       .OrderBy(m => m.Text.Replace("Barangay","").Trim().PadLeft(maxSize ,'0')); 
+0

что это линия означает?. 'x => x.Text.Length' Я знаю, что он получит длину текста. Объясните немного. – KiRa

+0

@KiRa - сначала в 'maxSize' мы определяем, какая максимальная длина вашей строки, например' Barangay 1', выдаст _10_ символов, в то время как 'Barangay 100' будет выставлять _12_ символов так далее. Предложение _OrderBy_ сначала мы удаляем обычный текст' Barangay', а затем добавьте дополнительный '0' слева, чтобы весь целочисленный текст становился равной длины, например' 010,100,011' и т. Д., А затем 'OrderBy' даст вам правильный результат. –

+0

за то, что я понимаю (исправьте меня, если я ошибаюсь), он получит только первые данные во всей записи ?. – KiRa

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