2015-07-14 10 views
6

सरणी की एक सूची को देखते हुए, मैं सूची में प्रत्येक सरणी के दूसरे सदस्य को तारों की सूची में निकालना चाहता हूं।सी # - सरणी की सूची से एक विशेष सरणी सदस्य की सूची निकालने के लिए कैसे करें

उदाहरण के लिए, सरणियों की सूची में शामिल हैं: 'ए', 'बी' &: {"1", "A", "X"} {"2", "B", "Y"} {"3", "C", "Z"}

तो मैं उत्पादन होना चाहते हैं क्या युक्त स्ट्रिंग की एक सूची है 'सी'

ताकि मैं कह सकते हैं:

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

myListofStrings.AddRange(???) 

उत्तर

12

आप निश्चित रूप से पता हैं कि सभी एक rrays इंडेक्स को 1 पर तत्व है, तो आप एक पंक्ति में LINQ के साथ यह कर सकता है:

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

Demo.

+0

डैंग ने मुझे मार दिया। लेकिन हाँ यह है कि 'चयन करें' के लिए बनाया गया था। – ryanyuyu

+0

यह उत्कृष्ट है यदि आप यहां प्रदर्शन के बारे में ज्यादा परवाह नहीं करते हैं, हालांकि LINQ लूप के लिए सरल रूप से धीमा है। – Fabjan

+2

@Fabjan क्या आप अपने "महत्वपूर्ण धीमे" दावे का समर्थन करने के लिए संख्याओं को साझा करना चाहते हैं? – dasblinkenlight

2

तुम बस नई सरणी बना सकते हैं और तत्वों है कि आप इसे करने के लिए अपने दांतेदार सरणी से की जरूरत है डाल:

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

या करना चाहते हैं कुछ की तरह:

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

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

पी एस 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(); 
    } 
} 

आउटपुट:

enter image description here

LINQ के बारे में अधिक यहाँ बनाम: For vs. Linq - Performance vs. Future

+0

ऐसे माइक्रो-बेंचमार्क सही होने के लिए कुख्यात रूप से कठिन हैं। अधिक सामान्य 3 गुना अंतर के बजाय स्पष्ट 11 गुना अंतर, दो स्रोतों से आता है: (1) आपके परीक्षण सेब-टू-संतरे हैं, क्योंकि 'FOR' परीक्षण सूची को कभी भी पुनर्स्थापित नहीं करता है, और (2) दोनों परीक्षण करते हैं "ठंडा" माप, जिसका अर्थ है कि समय-समय पर संकलक समय कोड के समय के साथ गिना जाता है। [यहां] (http://ideone.com/RVRbPl) आपका संशोधित बेंचमार्क है, जो 1689 बनाम 535 टिक अंतर दिखा रहा है। – dasblinkenlight

1

आप LINQ उपयोग करने के लिए नहीं करना चाहता था, तो - कोशिश ..

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

लेकिन फिर फिर से जो linq का उपयोग नहीं करना चाहता? – maksymiuk

+0

ठीक है, गति आदि के लिए - मैं इस तरह की साधारण नौकरियों के लिए केवल LINQ का उपयोग नहीं करता हूं। अब मैं उपरोक्त समय पर ध्यान देता हूं - मुझे आश्चर्य है कि मुझे क्यों चिह्नित किया गया है ... हमम! – Neil

संबंधित मुद्दे