C#动态选择属性进行排序

时间:2010-11-26 14:34:34

标签: c# sorting

我有一个带对象的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));
    }

这不起作用。 有没有办法将列更改为排序?

谢谢!

4 个答案:

答案 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)

是的我同意,总是使用通用列表来获得以下这些功能,

  • 类型安全
  • 更好的表现
  • 无需明确投射
  • 更好的增长算法。

此致

萨尔扎基