按列名称字符串排序

时间:2009-06-12 20:09:57

标签: .net silverlight sorting

我有一个可观察的收藏品。我想用linq对它进行排序。我有我要为我的类型排序(作为字符串)的属性的属性名称。

最好/最快的方法是什么?

不同的propertyname字符串将传递给函数

3 个答案:

答案 0 :(得分:2)

我只能通过反思来做到这一点。

var v = YouList.OrderBy(t => t.GetType().InvokeMember(sField,
    System.Reflection.BindingFlags.GetProperty,
    null,
    t,
    null)
).ToList());

我假设相同的代码适用于ObservableCollection ......

答案 1 :(得分:2)

您可以使用lambdas进行排序。我复制了DataGrid使用的内部类中的内容:

        IEnumerable<T> sortedList = _list.ToArray<T>();

        foreach (SortDescription sortDescription in SortDescriptions)
        {
            PropertyInfo propertyInfo = typeof(T).GetProperty(sortDescription.PropertyName);
            Func<T, object> keySelector = item => propertyInfo.GetValue(item, null);

            switch (sortDescription.Direction)
            {
                case ListSortDirection.Ascending:
                    sortedList = sortedList.OrderBy(keySelector);
                    break;
                case ListSortDirection.Descending:
                    sortedList = sortedList.OrderByDescending(keySelector);
                    break;
                default:
                    continue;
            }
        }

        T currentItem = _currentItem;

比试图找到IComparer更好,更好。

答案 2 :(得分:1)

您应该能够从该属性名称构造一个表达式并将其传递给OrderBy:

public IEnumerable<MyData> orderByDynamic(IEnumerable<MyData> objects, string propertyName) 
{
    var parameterExpression = Expression.Parameter(typeof(MyData), "x");
    var orderByExpression = Expression.Lambda<Func<MyData, TypeOfProperty>>(
        Expression.Property(parameterExpression, propertyName),
        parameterExpression);       
    return objects.OrderBy(orderByExpression)
}

问题是你需要在编译时知道属性的类型才能使其工作。