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 设置为 ICollectionViewListCollectionViewSourceCollection 设置为您自己的 List 并具有 SortDescription,其中 PropertyName 可以指定为字符串值...http://marlongrech.wordpress.com/2008/11/22/icollectionview-explained/

    Dynamic LINQ with MyList.AsQueryable().OrderBy(&lt;OrderByClause&gt;) 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# Sort 和 OrderBy 比较

在c#中List<>的orderby方法如何使用?如何对一个类别的数据按照其某个属性降序排列?

C# LINQ Orderby - 真/假如何影响 orderby?

Orderby() 没有正确排序数字 c#

C# OrderBy 的 VB MVC 等价物

C# 字符串数组 orderBy 重音字符问题