2013-03-21 6 views
0

У меня есть отсортированный списокСортировка SortedList на основе значения C#

private SortedList _slSorted = new SortedList(); 

_slSorted имеет значение, которое Field класса типа (на самом деле 2 классы поочередно сбрасывают в них), имеющие все свойства в них.

Например:

key:0 value:class1 object(having properties property 1 , property 2)

key:1 value:class2 object(having properties property 3 , property 4)

key:2 value:class1 object(having properties property 1 , property 2)

и так далее ..

Мне нужно отсортировать sortedList на основе либо свойство 1 или свойство 3.

что-то вроде собрать все значения свойств и сортировать их и переставить

Как я могу это сделать?

+1

'SortedList' использует пары ключ/значение. Список сортируется по ключу, а не по значению. Вы хотите сказать, что хотите сортировать значения? Покажите нам некоторый код, который иллюстрирует, как вы заполняете коллекцию. –

+0

@JimMischel: да по умолчанию список будет отсортирован по key..but, я хочу сортировать их по значениям. Спасибо за вашу помощь..и удалось переместить все значения и перестроить их, и я мог сортировать. я скоро опубликую свой рабочий код, поскольку у меня его нет прямо сейчас со мной.thanks снова –

+0

Возможный дубликат [Сортированный список C# по значению с объектом] (http://stackoverflow.com/questions/16649481/c-sharp-sorted -list-by-value-with-object) – nawfal

ответ

1

Вы можете создать новый список, который сортируется, написав класс, который реализует IComparer<object>, и передает его методу LINQ OrderBy. Как это:

SortedList theList = new SortedList(); 
// I assume you populate it here 
// Then, to sort: 
var sortedByValue = theList.Cast<object>().OrderBy(a => a, new ListComparer()).ToList(); 

Это сортирует элементы и создать новый List<object> называется sortedByValue. ListComparer показан ниже.

Принимая во внимание, что это отвечает на ваш вопрос, я сомневаюсь, что это то, чего вы действительно хотите. Но я не знаю достаточно о вашем приложении, как вы используете SortedList и что вы хотите сделать с приведенным выше результатом, чтобы дать какое-либо предложение сделать это по-другому. Я сильно подозреваю, что вам нужно переосмыслить свой дизайн, потому что то, что вы здесь делаете, довольно необычно.

Вот ListComparer.

public class ListComparer: IComparer<object> 
{ 
    public int Compare(object x, object y) 
    { 
     if (x == null && y == null) 
     { 
      return 0; 
     } 
     if (x == null) 
     { 
      return -1; 
     } 
     if (y == null) 
     { 
      return 1; 
     } 
     if (x is Class1) 
     { 
      if (y is Class1) 
      { 
       return (x as Class1).Prop1.CompareTo((y as Class1).Prop1); 
      } 
      // Assume that all Class1 sort before Class2 
      return 1; 
     } 
     if (x is Class2) 
     { 
      if (y is Class2) 
      { 
       return (x as Class2).Prop3.CompareTo((y as Class2).Prop3); 
      } 
      if (y is Class1) 
      { 
       // Class1 sorts before Class2 
       return -1; 
      } 
      // y is not Class1 or Class2. So sort it last. 
      return 1; 
     } 
     // x is neither Class1 nor Class2 
     if ((y is Class1) || (y is Class2)) 
     { 
      return -1; 
     } 
     // Don't know how to compare anything but Class1 and Class2 
     return 0; 
    } 
} 
+0

@ jimMischell-спасибо за подробный ответ ... я решил это, но использовал другой механизм. Теперь заменил его вашим кодом:) + 1 –

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