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

C# 用于保存两个值的好数据结构是什么?,c#,data-structures,C#,Data Structures,例如,我在我的应用程序中有一个类型的列表,该列表以人名作为名称,并包含两个值。该类型的名称是人名,该类型仅包含其年龄和性病人数 我的第一个想法是创建一个具有Age和NumStds属性的类,其中在构造函数中需要Age和NumStds,并创建一个我可以添加到其中的列表 class Person { public string Name { get; set; } public int NumSTDs { get; set; } public int Age { get; se

例如,我在我的应用程序中有一个类型的列表,该列表以人名作为名称,并包含两个值。该类型的名称是人名,该类型仅包含其年龄和性病人数

我的第一个想法是创建一个具有Age和NumStds属性的类,其中在构造函数中需要Age和NumStds,并创建一个我可以添加到其中的列表

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

听起来你在找工作

然后,要删除该项目,请执行以下操作:

peoples.Remove("Julie");
看一看这张照片

KeyedCollection类

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

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

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

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

我不确定您的要求,但只要看看文章末尾的Remove()语句,就可以使用linq表达式获得相同的效果

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

使用
词典的问题在于,您可能有一个与此人姓名不匹配的密钥。这是可以避免的,但我更愿意使用
哈希集
来完成这项工作。表演是一样的

您只需通过重写
GetHashCode
来准备类,以返回Name的哈希代码

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

如果有两个人同名怎么办?请使用string.Equals()而不是string.Compare()
peoples.Remove("Julie");
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");
}
people.Remove(p => string.Compare(p.Name, "Julia", true) == 0);
public override int GetHashCode()
{
    return Name.GetHashCode();
}