C# List OrderBy 问题
Posted
技术标签:
【中文标题】C# List OrderBy 问题【英文标题】:C# List OrderBy Problem 【发布时间】:2011-10-22 02:56:58 【问题描述】:我正在使用 WPF,但遇到了关于在列表中排序的问题。 我找到了它使用 OrderBy 的示例(T => T.[引用它进行排序的字段]) 例如
List<Contact> contacts = new List<Contact>();
contacts.OrderBy(Contact => Contact.PhoneNumber)
效果很好。
但是,如果我不知道类型,甚至不知道该类型中的字段,我应该如何实现排序功能?
例如:我应该在 OrderBy(??? => ????.?????) 中输入什么
事实上,我想制作一个通用的 GridView,当用户单击其中一个标题时,它将按相应的列对整个列表进行排序。
非常感谢!
【问题讨论】:
如果您不知道对象的类型,您将如何对列表进行排序?排序是什么意思? 因为不管用户输入的数据如何,我都想做一个通用的排序方法 看看这是否有帮助。看起来有些相似。访问***.com/questions/188141/…希望对您有所帮助 【参考方案1】:有两种选择。
-
使用反射收集可以排序的公共属性
或
使用能够启用的类(一个很好的例子是 DataTable)
您可以通过索引访问值,即。 Contacts.OrderBy(Contact => Contact[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的例子吗?谢谢!【参考方案2】:动态排序的两种解决方案...
GridView 的 ItemsSource 设置为 ICollectionView
或 ListCollectionView
,SourceCollection
设置为您自己的 List 并具有 SortDescription
,其中 PropertyName 可以指定为字符串值...http://marlongrech.wordpress.com/2008/11/22/icollectionview-explained/
Dynamic LINQ with MyList.AsQueryable().OrderBy(<OrderByClause>)
where 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 -->
或
<ListView myNameSpace:ListSortingBehavior.SortingSource="Generic" ... /> <!-- AsQueryable LINQ -->
如果您使用选项 1,您必须担心它,那么您将不得不假设 GridView.ItemsSource 始终是一个 ICollectionView。在第二种方法中,权衡是您必须在排序后“设置”ItemsSource。
我希望这会有所帮助...
【讨论】:
【参考方案3】:如果您想对数据网格、列表视图、列表框等进行排序。你应该试试ICollectionView。你能提供更多关于你想要什么的信息吗?
【讨论】:
其实,我想做一个通用的GridView,当用户点击每个网格列的标题时,具有排序功能。【参考方案4】:您可以使用枚举进行某些类型的排序
喜欢
Sort.name
Sort.phone
Sort.adress
排序将使用字母和数字以及 desc 或 asc
希望我有帮助
【讨论】:
以上是关于C# List OrderBy 问题的主要内容,如果未能解决你的问题,请参考以下文章
在c#中List<>的orderby方法如何使用?如何对一个类别的数据按照其某个属性降序排列?