按String成员排序自定义对象的ArrayList

时间:2010-02-04 18:34:15

标签: c# sorting arraylist

我在通过字符串字段排序自定义对象的 arraylist 时出现问题。
这是我正在尝试的代码:

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 个答案:

答案 0 :(得分:9)

也许您应该使用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);

答案 1 :(得分:5)

这是因为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。而是使用一些强类型集合。

答案 2 :(得分:3)

您需要实际创建一个实现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);

答案 3 :(得分:2)

您也可以使用System.Linq;

arrRegion.OrderBy(x=>x.RegNombre);