Tri d’un tableau par ordre alphabétique en C #

J’espère que quelqu’un peut aider. J’ai créé un tableau de longueur variable qui accepte plusieurs entrées de nom. Je veux maintenant sortinger le tableau dans l’ordre alphabétique et le retourner à l’écran de la console.

Je pensais que Array.Sort (noms); ferait cela pour moi, mais je reçois une exception. J’ai consulté des notes, des exemples et des informations en ligne, mais rien ne semble correspondre à ce que je fais.

J’ai fait le ci-dessous jusqu’à présent. Je suis sur le sharepoint me déchirer les cheveux ici! PS J’essaie de comprendre cela depuis des heures et je suis âgé de 30 ans et plus, mais je vous prie de ne pas simplement dire “Faites vos devoirs”. où je vais mal. C’est un dimanche et j’essaie de faire du travail supplémentaire et je n’ai pas de notes pour couvrir cela exactement

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Student_Array { class Program { struct Student { public ssortingng Name; } static void Main(ssortingng[] args) { int numberOfStudents; Student[] names; ssortingng input; Console.WriteLine("How many students are there?"); input = Console.ReadLine(); numberOfStudents = int.Parse(input); names = new Student[numberOfStudents]; for (int i = 0; i < names.Length; i++) { Student s; Console.WriteLine("Please enter student {0}'s name", (i + 1)); s.Name = Console.ReadLine(); names[i] = s; } ***Array.Sort(names);*** for (int i = 0; i < names.Length; i++) { Console.WriteLine(names[i].Name); } } } } 

Cela fera l’affaire

 Array.Sort(names, (x,y) => Ssortingng.Compare(x.Name, y.Name)); 

Votre problème ici pourrait être que vous confondez les notions d’élèves et de noms. En définissant la structure Student , vous créez une entité pouvant représenter plus qu’un simple nom. Vous pouvez, par exemple, l’étendre à Age , Hometown , etc. (Pour cette raison, il serait peut-être plus judicieux de nommer les students votre tableau plutôt que leurs names .)

 struct Student { public ssortingng Name; public int Age; public ssortingng Hometown; } 

Étant donné la possibilité de plusieurs champs, la méthode Array.Sort doit savoir sur quoi vous voulez sortinger votre liste. Voulez-vous que les étudiants soient classés par nom, par âge ou par ville?

Selon la documentation MSDN sur Array.Sort :

Trie les éléments d’un Array entier à l’aide de l’implémentation d’interface générique IComparable de chaque élément du tableau.

Cela signifie que le type que vous tentez de sortinger – dans votre cas, Student – doit implémenter l’ IComparable , afin que l’implémentation Array.Sort sache comment elle doit comparer deux instances Student . Si vous êtes convaincu que les étudiants seront toujours sortingés par nom, vous pouvez le mettre en œuvre de la manière suivante:

 struct Student : IComparable { public ssortingng Name; public int Age; public ssortingng Hometown; public int CompareTo(Student other) { return Ssortingng.Compare(this.Name, other.Name); } } 

Vous pouvez également fournir une fonction qui extrait la clé de sorting dans la méthode de sorting elle-même. Le moyen le plus simple d’y parvenir consiste à OrderBy méthode LINQ OrderBy :

 names = names.OrderBy(s => s.Name).ToArray(); 

Vous pouvez utiliser Sort en l’état si vous étendez Student pour implémenter IComparable .

  struct Student : IComparable { public ssortingng Name; public int CompareTo(Student other) { return Ssortingng.Compare(Name, other.Name, SsortingngComparison.CurrentCultureIgnoreCase); } } 

… ou vous pouvez passer un lambda de comparaison dans Sort …

 Array.Sort(names, (x, y) => Ssortingng.Compare(x.Name, y.Name, SsortingngComparison.CurrentCultureIgnoreCase)); 

… ou en tant que troisième option, créez simplement un nouveau tableau sortingé;

 var newArray = names.OrderBy(x => x.Name.ToLower()).ToArray(); 

Créer une classe de comparaison

 class StudentComparer : IComparer { public int Compare(Student a, Student b) { return a.Name.CompareTo(b.Name); } } 

Trier:

 Array.Sort(students,new StudentComparer()); 

Vous pouvez également l’utiliser au lieu d’utiliser Array.Sort.

 names = names.OrderBy(p => p.Name).ToArray(); 

Pour sortinger par la propriété name de vos objects Student dans votre tableau Student , vous pouvez utiliser

 Array.Sort(names, (s1, s2) => Ssortingng.Compare(s1.Name, s2.Name)); 

qui va sortinger votre tableau à la place, ou avec System.Linq :

 names = names.OrderBy(s => s.Name).ToArray(); 

qui peut renvoyer l’ IEnumerable sortingé sous la forme d’un tableau ( .ToArray() ) ou d’une liste ( .ToList() .)

N’oubliez pas de sortinger la casse sans distinction si c’est important, comme indiqué dans une autre réponse, ce qui peut être fait dans Ssortingng.Compare comme ceci:

 Ssortingng.Compare(s1.Name, s2.Name, SsortingngComparison.CurrentCultureIgnoreCase) 

vous pouvez trouver l’un des algorithmes de base ici: Simple bubble sort c #

vous devez faire quelques modifications, cet exemple est pour int, pour chaîne vous devez comparer les noms.

vous pouvez trouver de meilleurs algorithmes pour le sorting. pour l’instant, le sorting à bulles vous convient.