我正在使用WPF并遇到有关在List中排序的问题。 我发现它使用OrderBy的样本(T => T. [引用它进行排序的字段]) e.g。
List<Contact> contacts = new List<Contact>();
contacts.OrderBy(Contact => Contact.PhoneNumber)
效果很好。
但是,如果我不知道该类型,甚至不知道该类型的字段,我应该如何实现排序功能?
喜欢:我应该在OrderBy中添加什么(??? =&gt; ????。?????)
事实上,我想制作一个通用的GridView,当用户点击其中一个标题时,它会按相应的列对整个列表进行排序。
非常感谢你!
答案 0 :(得分:2)
有两种选择。
另见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)
动态排序的两种解决方案......
GridView的ItemsSource设置为ICollectionView
或ListCollectionView
,SourceCollection
设置为您自己的列表,并且SortDescription
其中PropertyName可以指定为字符串价值...... http://marlongrech.wordpress.com/2008/11/22/icollectionview-explained/
带有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?
因此,当用户单击网格视图列标题时,您必须提取列所代表的属性名称,并使用上述两种方法中的任何一种。在选项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
希望我有所帮助