2011-08-08 55 views
2

我正在使用WPF,並遇到有關在列表中排序的問題。 我發現它使用OrderBy的樣本(T => T [引用它進行排序的字段]) C#List OrderBy問題

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

它完美。

但是,如果我不知道類型,甚至不知道該類型的字段,我應該如何實現排序功能?

愛:我應該把在排序依據(??? => ???? ?????)

其實,我想作一般性的GridView中,當用戶點擊其中一個標題,它會按照相應的列對整個列表進行排序。

非常感謝!

+3

如果你不知道對象的類型,你將如何排序列表?排序是什麼意思? –

+0

,因爲儘管數據是用戶輸入的,我仍想製作一般的排序方法 – user883434

+0

看看這是否有幫助。看起來有些相似。 訪問http://stackoverflow.com/questions/188141/c-list-orderby-alphabetical-order 希望它能幫助 – Shadow

回答

0

的動態排序兩種解決方案...

  1. GridView的的ItemsSource設置爲ICollectionViewListCollectionViewSourceCollection設定爲自己的列表並具有SortDescription其中屬性名可以被指定爲一個字符串值... http://marlongrech.wordpress.com/2008/11/22/icollectionview-explained/

  2. 動態LINQ與MyList.AsQueryable().OrderBy(<OrderByClause>)其中ORDER BY子句可以動態創建...How do I apply OrderBy on an IQueryable using a string column name within a generic extension method?

所以,當用戶點擊網格視圖的列標題,您必須提取屬性的名稱將列代表和使用任何上述兩種方法。在選項2中,您必須在集合排序後設置ItemsSource。

這兩種方法中的任何一種都可以在附加行爲中完成,該附加行爲在GridViews上工作以獲得通用解決方案。

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

OR

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

所有你不用擔心,如果你使用的選項1,那麼你就必須假設GridView.ItemsSource總是要成爲的ICollectionView。在第二種方法中,折衷是在排序後你必須「設置」ItemsSource。

我希望這可以幫助...

+0

非常感謝!你真的幫我一個忙! – user883434

+0

答案1是完美的! – user883434

1

如果你想排序你的數據網格,列表視圖,列表框等。你應該嘗試ICollectionView。你能否提供一些你想要的信息。

+1

實際上,我想讓與排序功能的普通GridView控件,當用戶在每個網格的標題點擊柱。 – user883434

0

你可以用枚舉,使某些類型的排序

Sort.name 
Sort.phone 
Sort.adress 

和排序只是會用字母和數字遞減或遞增

希望我幫助

2

有兩種選擇。

  1. 使用反射來收集它可以在 或
  2. 使用類進行排序(一個很好的例子是數據表),這使 您可以通過索引IE訪問值的公共屬性。 contacts.OrderBy(Contact => Contact [3])

另請參閱c# properties as array notation

選項1擴展:

獲取公共屬性的數組似乎是一個不錯的選擇,是很容易的:

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

產生的陣列可以用來填充你的GridView的列和用於排序:

+0

你能給我一些答案1的例子嗎? 謝謝! – user883434