我如何根据int值在arraylist之下。但如果你编译下面的代码错误:无效操作例外...详细信息:无法比较数组中的两个元素。
namespace SortArray
{
class Program
{
static void Main(string[] args)
{
ArrayList otomobil = new ArrayList();
otomobil.Add(new Otomobil() { Model = 2000, Marka = "mercedes", Renk = "Kırmızı" });
otomobil.Add(new Otomobil() { Model = 2002, Marka = "Opel", Renk = "Yeşil" });
otomobil.Add(new Otomobil() { Model = 2009, Marka = "Audi", Renk = "Mavi" });
otomobil.Sort();
for (int i = 0; i < otomobil.Count; i++)
{
Console.WriteLine(otomobil[i].ToString());
}
}
}
public class Otomobil
{
public string Marka { get; set; }
public int Model { get; set; }
public string Renk { get; set; }
public Otomobil()
{
}
public override string ToString()
{
return Marka + "(" + Model.ToString() + "-" + Renk + ")";
}
public int CompareTo(object obj)
{
if (obj == null)
return 1;
Otomobil outer = obj as Otomobil;
if (outer == null)
throw new ArgumentException();
if (this.Model > outer.Model)
return 1;
else if (this.Model < outer.Model)
return -1;
else return 0;
}
}
}
答案 0 :(得分:5)
类Otomobil:IComparable
答案 1 :(得分:2)
这是我经常使用的通用比较器:
public class GenericComparer<T> : IComparer<T>
{
public string SortExpression { get; set; }
public int SortDirection { get; set; } // 0:Ascending, 1:Descending
public GenericComparer(string sortExpression, int sortDirection)
{
this.SortExpression = sortExpression;
this.SortDirection = sortDirection;
}
public GenericComparer() { }
#region IComparer<T> Members
public int Compare(T x, T y)
{
PropertyInfo propertyInfo = typeof(T).GetProperty(SortExpression);
IComparable obj1 = (IComparable)propertyInfo.GetValue(x, null);
IComparable obj2 = (IComparable)propertyInfo.GetValue(y, null);
if (SortDirection == 0)
{
return obj1.CompareTo(obj2);
}
else return obj2.CompareTo(obj1);
}
#endregion
}
要使用它:
class Program
{
static void Main(string[] args)
{
List<Otomobil> otomobil = new List<Otomobil>();
otomobil.Add(new Otomobil() { Model = 2000, Marka = "mercedes", Renk = "Kırmızı" });
otomobil.Add(new Otomobil() { Model = 2002, Marka = "Opel", Renk = "Yeşil" });
otomobil.Add(new Otomobil() { Model = 2009, Marka = "Audi", Renk = "Mavi" });
otomobil.Sort(new GenericComparer<Otomobil>("Model", 0 /* ASC */));
foreach(var item in otomobil)
{
Console.WriteLine(item.ToString());
}
}
}
我喜欢这个类,并且经常在ASP.NET中使用它,因为我可以使用(int)SortDirection.Ascending
而不是0作为第二个参数,这使得它更容易阅读。
您可以非常轻松地修改此GenericComparer类以接受Func<>
参数而不是字符串,以使其对重构友好。当然,这只适用于实现IComparable的属性。