C#List OrderBy问题

时间:2011-08-08 05:14:44

标签: c# wpf sql-order-by

我正在使用WPF并遇到有关在List中排序的问题。 我发现它使用OrderBy的样本(T => T. [引用它进行排序的字段]) e.g。

List<Contact> contacts = new List<Contact>();
contacts.OrderBy(Contact => Contact.PhoneNumber)

效果很好。

但是,如果我不知道该类型,甚至不知道该类型的字段,我应该如何实现排序功能?

喜欢:我应该在OrderBy中添加什么(??? =&gt; ????。?????)

事实上,我想制作一个通用的GridView,当用户点击其中一个标题时,它会按相应的列对整个列表进行排序。

非常感谢你!

4 个答案:

答案 0 :(得分:2)

有两种选择。

  1. 使用反射收集可以排序的公共属性 或
  2. 使用启用的类(一个很好的例子是DataTable) 你通过索引访问价值即。 contacts.OrderBy(联系方式=&gt;联系[3])
  3. 另见c# properties as array notation

    选项1扩展:

    获取一系列公共属性似乎是一个不错的选择并且非常简单:

    var propertyInfos = typeof(MyClass).GetProperties(BindingFlags.Public | BindingFlags.Instance);
    

    生成的数组可用于填充gridView的列并用于排序:

    contacts.OrderBy(Contact => propertyInfos[0].GetValue(Contact, null));
    

答案 1 :(得分:1)

如果要对datagrid,listview,listbox等进行排序。你应该尝试ICollectionView。你能提供一些你想要的更多信息。

答案 2 :(得分:1)

动态排序的两种解决方案......

  1. GridView的ItemsSource设置为ICollectionViewListCollectionViewSourceCollection设置为您自己的列表,并且SortDescription其中PropertyName可以指定为字符串价值...... http://marlongrech.wordpress.com/2008/11/22/icollectionview-explained/

  2. 带有MyList.AsQueryable().OrderBy(<OrderByClause>)的动态LINQ,其中order by子句可以动态创建... How do I apply OrderBy on an IQueryable using a string column name within a generic extension method?

  3. 因此,当用户单击网格视图列标题时,您必须提取列所代表的属性名称,并使用上述两种方法中的任何一种。在选项2中,您必须在对集合进行排序后设置ItemsSource。

    这两种方法中的任何一种都可以在适用于GridView的附加行为中完成,以便拥有通用解决方案。

    <ListView myNameSpace:ListSortingBehavior.SortingSource="CollectionView" ... /> <!-- CollectionView SortDescriptions -->
    

    OR

    <ListView myNameSpace:ListSortingBehavior.SortingSource="Generic" ... /> <!-- AsQueryable LINQ -->
    

    如果你使用option1,你只需要担心它,那么你必须假设GridView.ItemsSource总是一个ICollectionView。在第二种方法中,权衡是你必须在排序后“设置”ItemsSource。

    我希望这会有所帮助......

答案 3 :(得分:0)

您可以使用枚举进行某些类型的排序

喜欢

Sort.name
Sort.phone
Sort.adress

并且排序将使用字母和数字以及desc或asc

希望我有所帮助