在 Nvelocity 中实现排序



我有一个有大约 50 个属性的类,这个类的实例被添加到一个列表中。然后将此列表添加到速度上下文中。现在,我想对这些数据进行排序。在解析模板之前,不知道哪个字段,或者它是升序还是降序。

我研究过的资源:

在独立应用程序中使用Velocity的GenericTools的更好方法?

速度排序列表

http://velocity.apache.org/tools/devel/generic/

根据此处列出的资源,我不知道如何解决此问题。通用工具可用于城堡的 Nvelocity 吗?如果没有,我如何实现我在这里要求的这种通用排序?

我的解决方案是编写我自己的排序类并将其作为上下文添加到 nvelocity 中。我正在将要排序的字段作为字符串传递并作为反射访问它。我还设置了按字符串值升序或降序排序。我也以比较器的名义传递,并通过反思访问它。然后,我将List方法OrderBy 或 OrderByDescending 与所选字段和比较器一起使用。

我确实在这里找到了部分代码:http://zootfroot.blogspot.co.uk/2009/10/dynamic-linq-orderby.html

public class NvelocitySort
{
    public List<MyObject> Sort(List<MyObject> list, string fieldAndMode, string comparerName)
    {
        fieldAndMode = fieldAndMode.Trim();
        // Split the incoming string to get the field name and sort ascending or descending
        string[] split = fieldAndMode.Split(' ');
        // Set default sort mode
        string mode = "asc";
        // If sort mode not specified, this will be the field name
        string field = fieldAndMode;
        // If sort mode added split length shall be 2
        if (split.Length == 2)
        {
            field = split[0];
            if (split[1].ToLower() == "asc" || split[1].ToLower() == "ascending") mode = "asc";
            if (split[1].ToLower() == "desc" || split[1].ToLower() == "descending") mode = "desc";
        }
        // If length is more than 2 or 0, return same list as passed in
        else if (split.Length > 2 || split.Length == 0)
        {
            return list;
        }
        // Get comparer based on comparer name
        IComparer<string> comparer = (IComparer<string>)Activator.CreateInstance(Type.GetType(string.Format("Namespace.{0}", comparerName)));
        // Choose the sort order
        if (mode == "asc")
            return list.OrderBy(item => item.GetReflectedPropertyValue(field), comparer).ToList();
        if (mode == "desc")
            return list.OrderByDescending(item => item.GetReflectedPropertyValue(field), comparer).ToList();
        // If sort order not asc/desc return same list as passed in
        return list;
    }
}

这是用于检索字段的反射方法。

public static string GetReflectedPropertyValue(this object subject, string field)
{
    object reflectedValue = subject.GetType().GetProperty(field).GetValue(subject, null);
    return reflectedValue != null ? reflectedValue.ToString() : "";
}

简单的比较器示例:

public class TextComparer : IComparer<string>
{
    public int Compare(string x, string y)
    {
        return string.Compare(x, y);
    }
}

添加到 Nvelocity 上下文中,如下所示:

this.velocityContext.Put("sorter", new NvelocitySort());

从 Nvelocity 模板访问,如下所示:

#foreach($item in $sorter.Sort($listObject, "Name desc", "TextComparer"))  
$item.Name
#end

希望它对其他人有所帮助...

编辑:找到了更好的方法(实现多个字段排序):http://www.codeproject.com/Articles/280952/Multiple-Column-Sorting-by-Field-Names-Using-Linq

相关内容

  • 没有找到相关文章

最新更新