2011-12-11 12 views
5

たとえば、私のアプリケーションには、名前として人名を持ち、2つの値を持つタイプのリストがあります。タイプの名前は人名であり、タイプには年齢と標準数だけが含まれます。2つの値を保持するために使用するよいデータ構造は何ですか?

私の最初のアイデアは、AgeとNumStdsプロパティを持つPersonクラスを作成し、AgeとNumStdsがコンストラクタで必要な場合、追加できるListを作成することでした。

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

私はちょうど彼らの名でリスト<>に要素を参照し、それらに添付プロパティが乗るために一緒に来るかもしれないデータ構造がある場合、私はちょうど思っていました。私が言うことができるように

+2

同じ名前の人が2人いる場合はどうなりますか? – TrueWill

答えて

1

KeyedCollection<TKey, TValue> Classをご覧ください。

KeyedCollection <処理鍵、TValue >クラス

は、キー値に埋め込まれたコレクションの抽象基本クラスを提供します。

この抽象クラスから独自のコレクションクラスを派生させる必要があります。

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

例:Personクラスの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

うわー!ありがとう:D –

5

Dictionaryのように聞こえます。

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

もう1つのオプションはSystem.Collections.ObjectModel.KeyedCollectionです。実装にはもう少し作業が必要ですが、便利です。そして、あなたはあなたの例のように、コレクションに項目を追加することができます

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

::、この作品を作る人のためのコレクションクラスを作成し、GetKeyForItemメソッドをオーバーライドする

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

その後にアイテムを削除してください:

peoples.Remove("Julie"); 
1

あなたの要件はわかりませんが、記事の最後にRemove()ステートメントを見るだけで、linq式でも同じ効果が得られます。

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

string.Compare()の代わりにstring.Equals()を使用してください。 – slugster

0

このためDictionary<string, Person>を使用しての問題点は、人の名前と一致しないキーを持つことができるということです。これは避けることができますが、私はむしろ仕事のためにHashSet<Person>を使用したいと思います。パフォーマンスは同じです。

名前のハッシュコードを返すには、GetHashCodeをオーバーライドするだけでクラスを準備する必要があります。

public override int GetHashCode() 
{ 
    return Name.GetHashCode(); 
} 
関連する問題