2011-12-11 16 views
5

उदाहरण के लिए, मेरे पास मेरे आवेदन में एक प्रकार की एक सूची है जिसका नाम व्यक्ति के नाम के रूप में है और इसमें दो मान हैं। प्रकार का नाम व्यक्ति का नाम है और इस प्रकार में केवल उनकी उम्र और एसडीडी की संख्या है।दो मान रखने के लिए उपयोग करने के लिए एक अच्छी डेटा संरचना क्या है?

मेरा पहला विचार आयु और न्यूमसिट गुणों वाले व्यक्तियों की एक श्रेणी बनाना था जहां कन्स्ट्रक्टर में आयु और न्यूमसिड्स की आवश्यकता होती है और एक सूची जो मैं जोड़ सकता हूं।

class Person 
{ 
    public string Name { get; set; } 
    public int NumSTDs { get; set; } 
    public int Age { get; set; } 

    public Person(string name, int age, int stds) 
    { 
     Name = name; 
     Age = age; 
     NumSTDs = stds; 
    } 
} 

static void Main(string[] args) 
{ 
    List<Person> peoples = new List<Person>(); 
    peoples.Add(new Person("Julie", 23, 45)); 
} 

मैं सिर्फ अगर वहाँ एक डेटा संरचना जहां मैं सिर्फ सूची <> उनके नाम से में तत्वों को देखें और गुण उन्हें संलग्न सवारी के लिए साथ आ सकता था है सोच रहा था। जैसे मैं कह सकता हूं

people.Remove(Julie) 
+2

क्या होगा यदि एक ही नाम वाले दो लोग हैं? – TrueWill

उत्तर

1

KeyedCollection<TKey, TValue> Class पर एक नज़र डालें।

KeyedCollection < TKey, TValue > कक्षा

एक संग्रह जिसका कुंजी मूल्यों में एम्बेडेड रहे हैं के लिए सार आधार वर्ग प्रदान करता है।

आपको इस सारणी वर्ग से अपनी खुद की संग्रह कक्षा प्राप्त करने की आवश्यकता है, उदा।

class PersonCollection : KeyedCollection<string, Person> 
{ 
    protected override string GetKeyForItem(Person item) 
    { 
     return item.Name; 
    } 
} 

उदाहरण:

static void Main(string[] args) 
{ 
    var peoples = new PersonCollection(); 
    var julie = new Person("Julie", 23, 45) 
    peoples.Add(julie); 

    people.Remove(julie); 
    // - or - 
    people.Remove("Julie"); 
} 

ध्यान रखें कि आपके व्यक्ति वर्ग का नाम संपत्ति अपरिवर्तनीय होना चाहिए (केवल पढ़ने के लिए)।

+0

वू हू !! धन्यवाद: डी –

5

ऐसा लगता है कि आप Dictionary की तलाश में हैं।

Dictionary<string, Person> peoples = new Dictionary<string, Person>(); 
Person oPerson = new Person("Julie", 23, 45); 
peoples.Add(oPerson.Name, oPerson); 

एक अन्य विकल्प System.Collections.ObjectModel.KeyedCollection है। यह लागू करने के लिए थोड़ा और काम लेता है, लेकिन उपयोगी हो सकता है।

यह काम करते हैं, व्यक्ति के लिए एक संग्रह वर्ग बना सकते हैं और GetKeyForItem विधि ओवरराइड करने के लिए: करने के लिए फिर

PersonCollection peoples = new PersonCollection(); 
peoples.Add(new Person("Julie", 23, 45)); 

:

public class PersonCollection : System.Collections.ObjectModel.KeyedCollection<string, Person> 
{ 
    protected override string GetKeyForItem(Person item) 
    { 
     return item.Name; 
    } 
} 

तो फिर आप अपने उदाहरण के रूप में संग्रह करने के लिए आइटम जोड़ सकते हैं आइटम को हटाएं:

peoples.Remove("Julie"); 
1

मुझे आपकी आवश्यकताओं के बारे में निश्चित नहीं है, लेकिन बस अपनी पोस्ट के अंत में अपने निकालें() कथन को देखकर, आप एक linq अभिव्यक्ति के साथ एक ही प्रभाव प्राप्त कर सकते हैं।

people.Remove(p => string.Compare(p.Name, "Julia", true) == 0); 
+2

स्ट्रिंग के बजाय स्ट्रिंग। एक्वाल्स() का उपयोग करें। कॉम्पैयर() – slugster

0

इस के लिए एक Dictionary<string, Person> का उपयोग कर के साथ समस्या यह आप एक महत्वपूर्ण यह है कि व्यक्ति के नाम से मेल नहीं खाता हो सकता है है। इससे बचा जा सकता है, लेकिन मैं नौकरी के लिए HashSet<Person> का उपयोग करना चाहता हूं। प्रदर्शन वही है।

आपको नाम के हैश कोड को वापस करने के लिए केवल GetHashCode ओवरराइड करके अपनी कक्षा तैयार करने की आवश्यकता है।

public override int GetHashCode() 
{ 
    return Name.GetHashCode(); 
} 
संबंधित मुद्दे

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