我有一个带对象的arraylist,现在我需要对它们进行排序。
我有这个方法:
public Int32 CompareTo(object next)
{
SessionInfo nextCase = (SessionInfo)next;
return (this.Duration.CompareTo(nextCase.Duration));
}
现在我需要动态地将sortvalue从“Duration”更改为“Name” 所以我创建了一个名为SortColumn的属性,并赋予它值“持续时间”
现在我的代码看起来像这样:
public string SortColumn { get; set; }
public SessionInfo()
{
SortColumn = "Duration";
}
public Int32 CompareTo(object next)
{
SessionInfo nextCase = (SessionInfo)next;
return (this.SortColumn.CompareTo(nextCase.SortColumn));
}
这不起作用。 有没有办法将列更改为排序?
谢谢!
答案 0 :(得分:3)
为什么不使用通用列表,而不是arraylist,然后你可以免费排序(差不多):
var list = new List<SesionInfo>(); // then add items
list.Sort((s1,s2) => s1.SortColumn.CompareTo(s2.SortColumn));
答案 1 :(得分:2)
public int CompareTo(object next)
{
SessionInfo nextCase = (SessionInfo)next;
if(SortColumn == "Duration")
return (this.Duration.CompareTo(nextCase.Duration));
else if(SortColumn == "Name")
return (this.Name.CompareTo(nextCase.Name));
}
答案 2 :(得分:0)
它不起作用的原因是它按SortColumn属性的值进行排序,并且集合中的所有对象都具有相同的值。解决它的一种方法是使用反射来获取SortColumn属性命名的属性的值。
public Int32 CompareTo( object next )
{
SessionInfo nextCase = next as SessionInfo;
var sortProperty = this.GetType().GetProperty( this.SortColumn );
var currentValue = sortProperty.GetValue( this ) as IComparable;
var nextValue = sortProperty.GetValue( next ) as IComparable;
return currentValue.CompareTo( nextValue );
}
我省略了无效性检查以简化示例,但是您需要考虑如果属性不具有可比性,值为空等会发生什么。
更好的解决方案是使用通用列表和OrderBy扩展。然后你可以简单地做:
var sorted = collection.OrderBy( c => c.Duration );
或
var sorted = collection.OrderBy( c => c.Name );
如果您使用Dynamic LINQ,则可以按名称指定列。
var sorted = collection.OrderBy( "Duration" );
答案 3 :(得分:0)
是的我同意,总是使用通用列表来获得以下这些功能,
此致
萨尔扎基