使用自定义比较对ArrayList排序

时间:2014-11-11 05:02:35

标签: c# asp.net arrays sorting

我正在尝试使用c#对ArrayList进行排序。当ArrayList包含可比对象时,可以使用list.Sort()进行排序,但我需要对包含不可比较对象的ArrayList进行排序。例如,假设对象为Ring,并且它具有属性属性Price。然后我需要将ArrayList排序到价格订单。如果可以选择升序或降序更有帮助。谢谢!

  

块引用

arrAtdMon = **(ArrayList)** hashTb [unixMon];

if(arrAtdMon!= null)   monCount = arrAtdMon.Count;

int [] arrayMax = {monCount,tueCount,wedCount,thuCount,friCount};

int maxValue = arrayMax.Max();

KidAttendance valMon = null; string monTagName = string.Empty;

  

块引用

上面的数组列表将自行排序。

4 个答案:

答案 0 :(得分:3)

您可以通过实施IComparer界面来实现这一目标: -

public class Ring : IComparer
{
    public decimal Price { get; set; }

    public int Compare(object x, object y)
    {
        return ((Ring)x).Price.CompareTo(((Ring)y).Price);
    }
}

工作Fiddle

答案 1 :(得分:1)

首先,你真的应该使用List<T>类,而不是ArrayList。这样做不会解决您的问题,但这会使代码变得不那么脆弱,也更容易维护。

至于具体问题,你想做这样的事情......

假设:

class Ring { public decimal Price { get; set; } }

然后:

ArrayList list = ...; // Initialized as some collection of Ring instances

list.Sort(Comparer.Create((r1, r2) => r1.Price.CompareTo(r2.Price)));

这会使用Comparer Comparison<T>创建一个新的(r1, r2) => r1.Price.CompareTo(r2.Price)实例。也就是说,对于每个被比较的对象,将第一个的价格与第二个的价格进行比较。

答案 2 :(得分:1)

假设这些对象与price属性共享基类或接口,您应该能够执行以下操作:

// Base class with price property, could also be an shared interface
public abstract class Product
{
    public decimal Price{get;set;}
}

public class Ring : Product
{

}
public class Bag : Product
{

}

// Some test data
var myUnsortedArray = new Product[]{new Ring{Price = 1.2m}, new Bag{Price=2.5m}};

// Easy sort with LINQ
var sortedProducts = myUnsortedArray.OrderBy(p => p.Price).ToArray();
var sortedProductsDescending = myUnsortedArray.OrderByDescending(p => p.Price).ToArray();

<强>更新

我刚刚意识到问题是关于ArrayLists并且下面有改变的解决方案:

// Some test data
var myUnsortedArrayList = new ArrayList{new Ring{Price = 1.2m}, new Bag{Price=2.5m}};

// Easy sort with LINQ
var sortedProducts = myUnsortedArrayList.OfType<Product>().OrderBy(p => p.Price).ToArray();
var sortedProductsDescending = myUnsortedArrayList.OfType<Product>().OrderByDescending(p => p.Price).ToArray();

答案 3 :(得分:0)

要对一组对象进行排序,该对象需要是Comparable,您可以在CompareTo()方法中设置您想要的比较: IComparable information here