如何将给定值排序为泛型类型列表

时间:2017-02-02 14:03:13

标签: c# linq list generics

我要做的是这段代码

filtered = GetUserList().OrderBy(p => p.Name).ToList();

以通用方式

public static List<T> sortBy<T>(string field, List<T>list)
{
    //list.OrderBy(p=>p.Equals(field)).ToList();
    //list = list.OrderBy(p => p.GetType().GetProperties().ToList().Find(d => d.Name.Equals(field))).ToList();
    return list;
}

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

如果这是您的唯一要求,快速方式(而不是我链接的更复杂的方法)将通过反射访问属性。此扩展方法将为您提供所需内容:

public static class EnumerablePropertyAccessorExtensions
{
    public static IEnumerable<T> OrderBy<T>(this IEnumerable<T> enumerable, string property)
    {
        return enumerable.OrderBy(x => GetProperty(x, property));
    }

    private static object GetProperty(object o, string propertyName)
    {
        return o.GetType().GetProperty(propertyName).GetValue(o, null);
    }
}

Example on Fiddle

或者(稍微优化)像这样:

public static class EnumerablePropertyAccessorExtensions
{
    public static IEnumerable<T> OrderBy<T>(this IEnumerable<T> enumerable, string property)
    {
        var prop = typeof(T).GetProperty(property);
        return enumerable.OrderBy(x => GetProperty(x, prop));
    }

    private static object GetProperty(object o, PropertyInfo property)
    {
        return property.GetValue(o, null);
    }
}

Example on Fiddle

然后可以在任何IEnumerable<>上调用此扩展方法,如下所示:

filtered = GetUserList().OrderBy("Name").ToList();

但请注意,此实现并未真正优化或防错。如果这是你需要的,你可能想要达到目的。