2009-03-11 7 views
3

J'ai un struct contenant des données de la chanson:Comment trier un ensemble de structures?

public struct uLib 
    { 
     public string Path; 
     public string Artist; 
     public string Title; 
     public string Album; 
     public string Length; 
    } 

Ma bibliothèque se compose d'un tableau de ce uLib. Comment pourrais-je trier ce tableau en disant Artiste? Y a-t-il une fonction de tri native que je peux appeler sur ce type de tableau, ou devrais-je "lancer le mien"?

Répondre

16

Tout d'abord, cela ne devrait pas être une structure. Il est plus grand que 16 octets, de sorte que vous n'obtenez pas les avantages de performance d'avoir une structure. En outre, il ne représente pas une seule valeur, donc il n'a pas de sens sémantique pour en faire une structure. Fais juste un cours à la place.

La classe Array a une méthode Sort que vous pouvez utiliser:

Array.Sort(theArray, (x,y) => string.Compare(x.Artist,y.Artist)); 

Si vous n'avez pas C# 3 que vous utilisez un délégué au lieu de l'expression lambda:

Array.Sort(theArray, delegate(uLib x, uLib y) { return string.Compare(x.Artist,y.Artist) }); 

Edit:
Voici un exemple de ce à quoi pourraient ressembler vos données en tant que classe:

public class ULib { 

    private string _path, _artist, _title, _album, _length; 

    public string Path { get { return _path; } set { _path = value; } } 
    public string Artist { get { return _artist; } set { _artist = value; } } 
    public string Title { get { return _title; } set { _title = value; } } 
    public string Album { get { return _album; } set { _album = value; } } 
    public string Length { get { return _length; } set { _length = value; } } 

    public ULib() {} 

    public ULib(string path, string artist, string title, string album, string length) { 
     Path = path; 
     Artist = artist; 
     Title = title; 
     Album = album; 
     Length = length; 
    } 

} 

En C#, il y a une forme courte pour une propriété. Au lieu de cela crée automatiquement que l'écriture de code pour une variable privée et un setter et getter pour y accéder,:

public string Path { get; set; } 
+0

classe publique ULib ainsi –

+0

Cela fonctionne très bien. Merci. Vous dites que je ne devrais pas utiliser une structure, comment organiseriez-vous ce type de données? – Krakerjak

+0

Placez-le dans la classe et utilisez les propriétés à la place des champs publics. –

1

de u dans ULibArray par u.Artist sélectionnez u;

0

En supposant uLibs est un IEnumerable<T>, vous pouvez essayer ceci:

uLibs.OrderBy(i => i.Artist) 

Ce trie les uLib instances en utilisant une clé; Dans ce cas, vous avez sélectionné Artiste comme clé de comparaison. Un tri similaire est possible par rapport à vos autres champs.

+0

Vous perdrez le résultat si vous faites cela, cependant. La façon correcte de le faire est var orderedLibs = uLibs.OrderBy (i => i.Artist) – erikkallen

+0

Oui, ceci est destiné à être inclus dans le cadre d'une autre déclaration. Ce que vous faites avec le résultat dépend de vous, bien sûr. –

Questions connexes