2012-06-22 4 views
11

मैं इस वर्ग की एक सूची है साथ सूची बनाएँ। इस तरह:केवल एक वर्ग के सदस्य

public List<string> GetAllNames() 
{ return MyDataList<name>.ToList(); } 

तो, अगर मैं इस सूची है:

  1. name = जॉन - width = 10
  2. name = जैक - width = 25

मैं चाहता हूँ निम्नलिखित सूची:

  1. name = जॉन
  2. name = जैक

क्या यह संभव है?

उत्तर

21

उपयोग LINQ:

public List<string> GetAllNames() 
{ 
    return MyDataList.Select(i => i.name).ToList(); 
} 
+1

LINQ चट्टानों! धन्यवाद। – Nick

+4

एक नोट के रूप में, यदि आप एक सूची लौटाते हैं तो आप मूल रूप से पूरी सूची को डुप्लिकेट करने जा रहे हैं। यदि आपके पास बड़ी सूची है तो इसमें समय/स्मृति लग सकती है। यदि आप IENumerable का उपयोग करने के लिए स्विच करते हैं और फिर .TList() नहीं करते हैं, तो आपको एक आलसी सूची मिल जाएगी जो लगभग बनाने के लिए स्वतंत्र है, और अंतरिक्ष के बहुत कम (<100bytes) –

+2

@TimothyBaldridge: True का उपभोग करेगी। यह ध्यान देने योग्य भी है कि यदि आप 'आईन्यूमेरेबल' मार्ग पर जाते हैं, तो हर बार जब आप इसे फिर से भरते हैं तो इसका फिर से मूल्यांकन किया जाएगा। आपका आईनेमरेबल भी ऑब्जेक्ट्स के मूल सेट से जुड़ा हुआ है, इसलिए यह कचरा कलेक्टर को सभी 'डेटा' ऑब्जेक्ट्स को साफ करने से रोक देगा, भले ही आप कभी भी उनसे नामों का उपयोग करने की योजना बना रहे हों। इसके अलावा, यदि 'MyDataList' बदलता है, तो लौटाया गया' IENumerable' बदल जाएगा, और अगर यह एक अलग थ्रेड में उपयोग किया जा रहा है तो अपवाद फेंक सकता है। अक्सर इनमें से कोई भी मामला नहीं है, लेकिन यह समझना हमेशा अच्छा होता है कि कवर के तहत क्या हो रहा है। – StriplingWarrior

2

आप .NET 3.5 (VS2008) या बाद में उपयोग कर रहे हैं तो विस्तार तरीकों का उपयोग:

public class Data { String Name; Int32 Width; } 
public List<Data> MyData = new List<Data>(); 

public static IEnumerable<String> GetNames(this List<Data> data) { 
    foreach(Data d in data) yield return d.Name; 
} 
// or use Linq to return a concrete List<String> implementation rather than IEnumerable. 
2
public List<string> GetAllNames() 
{ 
    return myDataList.Select(item => item.name).ToList(); 
}