2011-08-08 2 views
2

Je travaille avec WPF et j'ai rencontré un problème de tri dans une liste. Je trouve l'échantillon qu'il utilise OrderBy (T => T. [le champ qui s'y rapporte pour le tri]) par exemple.C# Liste OrderBy Problème

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

Cela fonctionne parfaitement.

Cependant, si je ne connais pas le type et même ne connais pas le champ dans ce type, comment devrais-je implémenter la fonction de tri?

comme: Que dois-je mettre en OrderBy dans (. ??? => ???? ?????)

En fait, je veux faire un GridView général dans lequel, lorsque l'utilisateur clique sur un des en-têtes, il va trier toute la liste par la colonne correspondante.

Merci beaucoup!

+3

Comment allez-vous trier la liste si vous ne connaissez pas le type d'objets? Que voulez-vous dire par le tri? –

+0

parce que je veux faire une méthode de tri générale malgré les données que l'utilisateur a entrées – user883434

+0

Voir si cela aide. On dirait que quelque chose de similaire. visite http://stackoverflow.com/questions/188141/c-list-orderby-alphabetical-order Hope it helps – Shadow

Répondre

0

Deux solutions pour le tri dynamique ...

  1. ItemsSource de GridView est réglé sur un ICollectionView ou ListCollectionView avec SourceCollection défini comme votre propre liste et ayant un SortDescription où PropertyName peut être spécifié comme une valeur de chaîne ... http://marlongrech.wordpress.com/2008/11/22/icollectionview-explained/

  2. dynamique LINQ avec MyList.AsQueryable().OrderBy(<OrderByClause>) où l'ordre par l'article peut être créé dynamiquement ...How do I apply OrderBy on an IQueryable using a string column name within a generic extension method?

Ainsi, lorsque l'utilisateur clique sur les en-têtes de colonnes d'affichage de la grille, vous devez extraire le nom de la propriété que la colonne représente et utiliser l'une des deux approches ci-dessus. Dans l'option 2, vous devrez définir l'ItemsSource après le tri de la collection.

L'une des deux approches peut être effectuée dans un comportement attaché qui fonctionne sur GridViews afin d'avoir une solution générique.

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

OU

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

Tout ce que vous avez à vous soucier si vous utilisez option1, alors vous devez supposer que le GridView.ItemsSource va toujours être un ICollectionView. En deuxième approche, le compromis est que vous auriez à "définir" la ItemsSource après le tri.

J'espère que cela aide ...

+0

Merci beaucoup !!! tu me fais vraiment une faveur !!!! – user883434

+0

La réponse 1 est parfaite !! – user883434

1

si vous voulez trier votre grille de données, listview, listbox et ainsi de suite. vous devriez essayer ICollectionView. Pouvez-vous donner plus d'informations sur ce que vous voulez?

+1

en fait, je veux faire un GridView général avec fonction de tri lorsque les utilisateurs cliquent sur l'en-tête de chaque grille colonne. – user883434

0

Vous pouvez utiliser ENUM pour faire certains types de tri

Comme

Sort.name 
Sort.phone 
Sort.adress 

et le tri juste sera avec des lettres et des chiffres et desc ou asc

espère avoir l'aide

2

Il existe deux options.

  1. utiliser la réflexion pour collecter les propriétés publiques qui peuvent être triés sur ou
  2. cours d'utilisation (un bon exemple serait DataTable) qui permettent d'accéder à vous valeurs par index par exemple. contacts.OrderPar (Contact => Contact [3])

Voir aussi c# properties as array notation.

Option 1 étendu:

Obtenir un ensemble de propriétés publiques semble un bon choix et il est assez facile:

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

Le tableau résultant peut être utilisé pour remplir les colonnes de votre GRIDVIEW et utilisé pour tri:

+0

pouvez-vous me donner quelques exemples de réponse 1? Merci! – user883434