2014-11-20 3 views
0

Как заказать ArrayList объектов одним из атрибутов объектов?Как заказать ArrayList объектов одним из атрибутов объектов?

И, пожалуйста, не предлагайте какой-либо метод делать с List<T>. Для моего текущего программного обеспечения использование List<T> не может быть и речи.

+3

Существует пример на [MSDN страницы для ArrayList] (http://msdn.microsoft.com/en-us/library /0e743hdt(v=vs.110).aspx). Вы пытались что-либо использовать, используя этот пример в качестве отправной точки? – Steve

+0

@dasblinkenlight LINQ в любом случае не работает с универсальными коллекциями. Вы можете создать общую коллекцию из 'ArrayList', отсортировать ее и создать новый ArrayList с отсортированными элементами, но я не думаю, что это хорошая идея. Как указал Стив, уже существует метод 'Sort', определенный на' ArrayList'. – MarcinJuraszek

+0

с использованием LINQ также не подходит, потому что я кодирую устаревшее программное обеспечение, и я просил не использовать LINQ для этого. Мой массивList содержит много объектов, таких как X, Y, Z и т. Д., И я хочу сортировать arraylist на основе только свойства одного объекта, такого как Y. Может ли кто-нибудь предложить мне какое-либо представление об этом? –

ответ

1

Вы должны реализовать IComparer для вашей организации, как:

public class MyClassComparer : IComparer<MyClass> 
{ 
    public int Compare(MyClass _x, MyClass _y) 
    { 
     return _x.MyProp.CompareTo(_y.MyProp); 
    } 
} 

И передать его ArrayList.Sort как:

myArrayList.Sort(new MyClassComparer()); 
+0

Согласно комментариям, массив может содержать различные типы –

+1

@PanagiotisKanavos и что это изменяет? Подход останется прежним. Возможно, мы можем работать с интерфейсами вместо конкретного класса или, возможно, делать сравнения с объектами и сравнивать вещи с помощью отражения. – Vladimirs

+0

Это означает, что вам нужно проверить тип каждого объекта, вы не можете использовать общий компаратор. На самом деле, IComparer не реализует IComparer, поэтому он не может быть передан в ArrayList.Sort –

0

Вы должны реализовать свой собственный компаратор, MSDN link

0

Это пример, написанный с использованием LinqPad, который может вам помочь. Непосредственно на основе примера MSDN.
Вам просто нужно использовать свой собственный класс, вместо используемого образца здесь

void Main() 
{ 
    ArrayList al = new ArrayList(); 
    al.Add(new Person() {Name="Steve", Age=53}); 
    al.Add(new Person() {Name="Thomas", Age=30}); 

    al.Sort(new PersonComparer()); 

    foreach(Person p in al) 
     Console.WriteLine(p.Name + " " + p.Age); 

} 

class Person 
{ 
    public string Name; 
    public int Age; 
} 
class PersonComparer : IComparer 
{ 

    int IComparer.Compare(Object x, Object y) 
    { 
     if (x == null) 
      return (y == null) ? 0 : 1; 

     if (y == null) 
      return -1; 

     Person p1 = x as Person; 
     Person p2 = y as Person; 

     // Uncomment this to sort by Name 
     // return((new CaseInsensitiveComparer()).Compare(p1.Name, p2.Name)); 

     return(p1.Age - p2.Age); 
    } 
} 
+0

спасибо Стив.: D это сработало для меня. : D SUPER HELPFUL !! –

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