2015-07-14 18 views
6

Dato un elenco di matrici, vorrei estrarre il secondo membro di ciascun array nell'elenco a un elenco di stringhe.C# - Come estrarre un elenco di un particolare membro di matrice da un elenco di matrici

Per esempio, dicono che la lista di array contiene: {"1", "A", "X"} {"2", "B", "Y"} {"3", "C", "Z"}

poi quello che mi piacerebbe l'uscita di essere è una lista di stringhe contenente: "A", "B" & "C"

in modo che io potessi dire:

List<string> myListOfStrings = new List<string>(); 

myListofStrings.AddRange(???) 

risposta

12

Se si sa per certo che tutto un rrays hanno Elemento in corrispondenza dell'indice 1, si potrebbe farlo con LINQ in una sola riga:

var myListOfStrings = listOfArrays.Select(a => a[1]).ToList(); 

Demo.

+0

Dang mi ha battuto. Ma sì, questo è il motivo per cui ".Select". – ryanyuyu

+0

È eccellente se non ci si preoccupa molto delle prestazioni qui, tuttavia LINQ è significativamente più lento del semplice ciclo. – Fabjan

+2

@Fabjan Ti dispiacerebbe condividere i numeri per supportare la tua richiesta "significativamente più lenta"? – dasblinkenlight

2

Si può solo creare nuovi array e mettere gli elementi che ti servono da tua matrice irregolare ad esso:

List<string> myListOfStrings = (new[] {listOfArrays[0][1], listOfArrays[1][1]), listOfArrays[2][1]}).ToList(); 

O fare qualcosa di simile:

List<string> myListOfStrings = new List<string>(); 

for(int i = 0; i < listOfArrays.Length; i++) myListOfStrings.Add(listOfArrays[i][1]); 

PS Specialmente per dasblinkenligh:

class Program 
{ 
    static string[][] GetRandomJaggedArray(int numberOfArrays, int numberOfElements) 
    { 
     string[][] temp = new string[numberOfArrays][]; 
     for (int i = 0; i < numberOfArrays; i++) 
     { 
      temp[i] = new string[numberOfElements]; 
      for (int i2 = 0; i2 < temp.Length; i2++) 
       temp[i][i2] = Guid.NewGuid().ToString();                        
     } 

     return temp; 
    } 

    static TimeSpan getElementsAtIndexLINQ(string[][] listOfArrays, int index, int count) 
    { 
     Stopwatch s = new Stopwatch(); 
     List<string> myListOfStrings; 

     s.Start(); 
     for (int i = 0; i < count; i++)    
      myListOfStrings = listOfArrays.Select(a => a[index]).ToList();    
     s.Stop(); 
     return s.Elapsed; 
    } 

    static TimeSpan getElementsAtIndexFOR(string[][] listOfArrays, int index, int count) 
    { 
     Stopwatch s = new Stopwatch(); 
     List<string> myListOfStrings = new List<string>(); 

     s.Start(); 
     for (int i2 = 0; i2 < count; i2++) 
      for (int i = 0; i < listOfArrays.Length; i++) myListOfStrings.Add(listOfArrays[i][index]); 
     s.Stop(); 
     return s.Elapsed; 
    } 

    static void Main(string[] args) 
    { 
     string[][] test1 = GetRandomJaggedArray(100, 1000); 

     string[][] test2 = GetRandomJaggedArray(100, 1000); 

     TimeSpan t1 = getElementsAtIndexLINQ(test1, 1, 10); 

     TimeSpan t2 = getElementsAtIndexFOR(test2, 1, 10); 

     Console.WriteLine("Linq method took {0} ticks to execute", t1.Ticks); 

     Console.WriteLine("For method took {0} ticks to execute", t2.Ticks); 

     Console.ReadKey(); 
    } 
} 

uscita:

enter image description here

più su LINQ VS qui: For vs. Linq - Performance vs. Future

+0

I micro-benchmark del genere sono notoriamente difficili da ottenere. L'apparente differenza di 11 volte, invece della più tipica 3 volte di differenza, deriva da due fonti: (1) i test sono mele-a-arance, perché il test 'FOR' non resetta mai la lista, e (2) entrambi i test fanno misure "fredde", il che significa che i tempi del compilatore just-in-time sono contati con i tempi del codice stesso. [Here] (http://ideone.com/RVRbPl) è il tuo benchmark modificato, mostrando la differenza tra 1689 e 535 tick. – dasblinkenlight

1

Se non si desidera utilizzare LINQ - provare ..

foreach(Array arItems in listOfArrays) 
    myListOfStrings.Add(arItem[ 1 ]); 
+1

Ma poi di nuovo chi non vuole usare linq? – maksymiuk

+0

Bene, per la velocità ecc. - Non uso LINQ solo per lavori semplici come questo. Ora noto gli orari post sopra - Mi chiedo perché sono stato segnato giù ... Hmmm! – Neil

Problemi correlati