用于保存两个值的良好数据结构是什么?

时间:2011-12-11 03:41:35

标签: c# data-structures

例如,我在我的应用程序中有一个类型列表,其中包含一个人名作为名称,并包含两个值。类型的名称是人员姓名,类型仅包含他们的年龄和std的数量。

我的第一个想法是创建一个具有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)); 
}

我只是想知道是否有一个数据结构,我只能引用List&lt;&gt;中的元素。根据他们的名字,并附上他们的属性来骑。就像我说的那样

people.Remove(Julie) 

4 个答案:

答案 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。这需要更多的工作来实现,但可能很有用。

要使其工作,请为person创建一个集合类并覆盖GetKeyForItem方法:

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

然后您可以像在示例中一样向集合中添加项目:

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

然后删除该项目:

peoples.Remove("Julie");

答案 1 :(得分:1)

查看KeyedCollection<TKey, TValue> Class

  

KeyedCollection&lt; TKey,TValue&gt;类

     

为其键嵌入值的集合提供抽象基类。

您需要从此抽象类派生自己的集合类,例如

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

请注意,Person类的Name属性应该是不可变的(只读)。

答案 2 :(得分:1)

我不确定您的要求,但只是在帖子结尾处查看您的Remove()语句,您可以使用linq表达式获得相同的效果。

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

答案 3 :(得分:0)

使用Dictionary<string, Person>的问题在于,您可以拥有一个与该人名不匹配的密钥。这可以避免,但我宁愿使用HashSet<Person>来完成这项工作。表现是一样的。

您只需要通过覆盖GetHashCode来准备您的类,以返回名称的哈希码。

public override int GetHashCode()
{
    return Name.GetHashCode();
}