Сортировать ArrayList пользовательских объектов по элементу String - PullRequest
3 голосов
/ 04 февраля 2010

У меня проблема с сортировкой массива пользовательских объектов по полю string .
Вот код, который я пытаюсь сделать:

arrRegion.Sort(delegate(Portal.Entidad.Region x, Portal.Entidad.Region y)
                           {
                               return x.RegNombre.CompareTo(y.RegNombre);
                           });

Но я получаю эту ошибку:

Argument type 'anonymous method' is not assignable to parameter type 'System.Collection.IComparer'

Чего мне не хватает?

Ответы [ 4 ]

9 голосов
/ 04 февраля 2010

Возможно, вам следует использовать методы расширения, предоставленные в пространстве имен System.Linq:

using System.Linq;
//...

// if you might have objects of other types, OfType<> will
// - filter elements that are not of the given type
// - return an enumeration of the elements already cast to the right type
arrRegion.OfType<Portal.Entidad.Region>().OrderBy(r => r.RegNombre);

// if there is only a single type in your ArrayList, use Cast<>
// to return an enumeration of the elements already cast to the right type
arrRegion.Cast<Portal.Entidad.Region>().OrderBy(r => r.RegNombre);

Если у вас есть контроль над исходным списком ArrayList и вы можете изменить его тип на типизированный список, подобный этому List<Portal.Entidad.Region>, я бы посоветовал вам сделать это. Тогда вам не нужно будет разыгрывать все потом и вы можете сортировать так:

var orderedRegions = arrRegion.OrderBy(r => r.RegNombre);
5 голосов
/ 04 февраля 2010

Это связано с тем, что метод Sort ожидает реализацию IComparer , которая не может быть делегатом. Например:

public class RegionComparer : IComparer
{
    public int Compare(object x, object y)
    {
        // TODO: Error handling, etc...
        return ((Region)x).RegNombre.CompareTo(((Region)y).RegNombre);
    }
}

и затем:

arrRegion.Sort(new RegionComparer());

P.S. Если вы все еще не застряли в .NET 1.1, не используйте ArrayList . Вместо этого используйте строго типизированные коллекции.

3 голосов
/ 04 февраля 2010

Вам нужно создать класс, который реализует IComparer , и предоставить его.

Это можно сделать с помощью частного класса:

private class RegNombreComparer: IComparer
{
    int IComparer.Compare( Object xt, Object yt )  
    {
        Portal.Entidad.Region x = (Portal.Entidad.Region) xt;
        Portal.Entidad.Region y = (Portal.Entidad.Region) yt;
        return x.RegNombre.CompareTo(y.RegNombre);
    }
}

Затем вы делаете:

arrRegion.Sort(new RegNombreComparer());

Это один недостаток ArrayList, и поэтому использование List<T> (особенно с LINQ) может быть выгодным. Это упрощает это и позволяет вам указать ваш заказ в строке:

var results = arrRegion.OrderBy(i => i.RegNombre);
2 голосов
/ 04 февраля 2010

Вы также можете использовать System.Linq;.

arrRegion.OrderBy(x=>x.RegNombre);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...