2013-05-19 22 views
9

Spero che qualcuno possa aiutarti. Ho creato una matrice di lunghezza variabile che accetta diversi input di nome. Ora voglio ordinare la matrice in ordine alfabetico e tornare alla schermata della console.Ordinamento di una matrice in ordine alfabetico in C#

Ho pensato che Array.Sort (nomi); farebbe questo per me ma sto ottenendo un'eccezione generata. Ho guardato note, esempi e on-line ma nulla sembra corrispondere a quello che sto facendo.

Ho fatto il seguito finora. Sono vicino a strapparmi i capelli qui! PS Ho cercato di capirlo per ore e ho più di 30 anni cercando di imparare me stesso, quindi per favore non dire "fai i compiti" ho cercato di risolvere questo e non posso quindi ho bisogno di qualcuno spiega dove sto andando male. Si tratta di una Domenica e sto cercando di fare un lavoro extra e non hanno note per coprire questo esattamente

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace Student_Array 
{ 
    class Program 
    { 
     struct Student 
     { 
      public string Name; 
     } 

     static void Main(string[] args) 
     { 
      int numberOfStudents; 
      Student[] names; 
      string 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<Student>(names);*** 
      for (int i = 0; i < names.Length; i++) 
      { 

       Console.WriteLine(names[i].Name); 
      } 
     } 
    } 
} 

risposta

19

Questo farà il trucco

Array.Sort(names, (x,y) => String.Compare(x.Name, y.Name)); 
+1

+1 per la risposta più breve e più compatibile. –

+0

Mi scuso, ho segnato come risposta ma non ho mai risposto con Grazie. Era perfetto – user001

7

tuo problema qui potrebbe essere che si sta confondendo le nozioni di studenti e nomi. Definendo la struttura Student, si sta creando un'entità che può rappresentare più di un semplice nome. Ad esempio, è possibile estenderlo per includere Age, Hometown e così via. (Per questo motivo, potrebbe essere più significativo per citarne l'array students piuttosto che names.)

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

Data la possibilità di più campi, il metodo Array.Sort ha bisogno di sapere che cosa si vuole ordinare l'elenco su. Vuoi studenti ordinati per nome, per età o per città?

Per la documentazione MSDN Array.Sort<T>:

ordina gli elementi in un'intera Array utilizzando l'implementazione dell'interfaccia generica IComparable<T> di ciascun elemento della matrice.

Ciò significa che il tipo si sta tentando di ordinare - nel tuo caso, Student - deve implementare l'interfaccia IComparable<T>, in modo che il Array.Sort implementazione di sapere come si deve confrontare due Student istanze. Se siete convinti che gli studenti saranno sempre essere ordinati per nome, si potrebbe implementare in questo modo:

struct Student : IComparable<Student> 
{ 
    public string Name; 
    public int Age; 
    public string Hometown; 

    public int CompareTo(Student other) 
    { 
     return String.Compare(this.Name, other.Name); 
    } 
} 

In alternativa, è possibile fornire una funzione che estrae la chiave di ordinamento per il metodo di ordinamento stesso. Il modo più semplice per ottenere questo risultato è attraverso il metodo LINQ OrderBy:

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

destro, e come fa a ordinarla? Non una risposta –

+3

@ newStackExchangeInstance: Ovviamente è una risposta. Se implementa IComparable, il suo problema viene risolto chiamando Array.Sort. –

0

Per ordinare dalla name proprietà dei vostri Student oggetti nel Student array, è possibile utilizzare

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

che ordinare l'array al suo posto, o con System.Linq:

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

che può restituire il ordinato 012.come array (.ToArray()) o un elenco (.ToList().)

Ricordarsi di ordinare case-insensitive se è importante, come sottolineato in un'altra risposta, che può essere fatto in String.Compare in questo modo:

String.Compare(s1.Name, s2.Name, StringComparison.CurrentCultureIgnoreCase) 
-3

puoi trovare uno degli algoritmi di base qui: Simple bubble sort c#

devi fare alcune modifiche, quell'esempio è per int, per stringa devi confrontare e nomi.

è possibile trovare algoritmi migliori per l'ordinamento. per ora bubble sort è ok per te.

+2

-1 per non dare una risposta, ma riferirsi ad altri link o ad alcune frasi che, per l'OP, non sono una risposta concreta. –

0

È possibile utilizzare anche questo, invece di utilizzare Array.Sort.

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

è possibile utilizzare Sort come se estendere Student per implementare IComparable;

struct Student : IComparable<Student> 
    { 
     public string Name; 
     public int CompareTo(Student other) 
     { 
      return String.Compare(Name, other.Name, 
        StringComparison.CurrentCultureIgnoreCase); 
     } 
    } 

... oppure si può passare un lambda confrontare in Ordina ...

Array.Sort<Student>(names, (x, y) => String.Compare(x.Name, y.Name, 
            StringComparison.CurrentCultureIgnoreCase)); 

... o come terza opzione basta creare un nuovo, ordinato, un array;

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

Per l'ultimo, forse l'ordinamento per 'x => x.Name.ToLower()' può essere suggerito –

+0

@JordanTrudgett Ah, sì, ho perso l'ultima parte :) –

0

creare una classe di confronto

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

Ordina:

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