2015-07-14 18 views
6

Diziler listesi verildiğinde, listedeki her dizinin ikinci üyesini dizelerin bir listesine çıkarmak istiyorum.C# - Diziler listesinden belirli bir dizi üyesinin listesi nasıl çıkarılır

Örneğin, diziler listesi içerdiğini varsayalım: "A", "B" &: {"1", "A", "X"} {"2", "B", "Y"} Olmak çıktı istediklerinizi sonra {"3", "C", "Z"}

içeren dizeleri listesidir "C" diyorum diye

:

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

myListofStrings.AddRange(???) 

cevap

12

zaman emin Eğer hepsi bir Sadece yeni bir dizi oluşturabilir

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

Demo.

+0

Dang beni dövdü. Ama evet bu, 'Yapma' için yapıldı. – ryanyuyu

+0

Performans hakkında çok fazla şey umursamıyorsanız mükemmeldir, ancak LINQ döngü için daha yavaş ve daha basittir. – Fabjan

+2

@Fabjan "Önemli ölçüde daha yavaş" iddiasını desteklemek için sayıları paylaşmayı düşünür müsünüz? – dasblinkenlight

2

ve bunun için pürüzlü diziden gereken unsurları koymak: rrays tek çizgide LINQ ile yapabileceğini, dizin 1'de öğesi

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

Veya yapmak gibi bir şey:

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

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

PS dasblinkenligh için Özel:

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(); 
    } 
} 

Çıktı: Burada İÇİN vs LINQ hakkında

enter image description here

Daha: LINQ kullanmak istemeseydi For vs. Linq - Performance vs. Future

+0

Bunun gibi mikro ölçütler doğru bir şekilde anlaşılması zor. Görünen 11 kat fark, daha tipik 3 kat farkı yerine, iki kaynaktan gelir: (1) testleriniz elmalar arasıdır, çünkü "FOR" testi hiçbir zaman listeyi tekrarlamaz ve (2) her iki test de "soğuk" ölçümler, tam zamanında derleyici zamanlamasının kodun kendisinin zamanlamasıyla sayıldığı anlamına gelir. [Burada] (http://ideone.com/RVRbPl), sizin 1689 vs 535 kene farkını gösteren değiştirilmiş referansınızdır. – dasblinkenlight

1

- deneyin ..

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

Ama sonra yine linq kullanmak istemiyor? – maksymiuk

+0

Eh, hız vb. - Ben sadece böyle basit işler için LINQ kullanmıyorum. Şimdi yukarıda yazılan zamanların dikkatini çekiyorum - neden aşağıya işaretlendiğimi merak ediyorum ... Hmmm! – Neil

İlgili konular