我正在尝试使用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;
块引用
上面的数组列表将自行排序。
答案 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