C# 用于保存两个值的好数据结构是什么?
例如,我在我的应用程序中有一个类型的列表,该列表以人名作为名称,并包含两个值。该类型的名称是人名,该类型仅包含其年龄和性病人数 我的第一个想法是创建一个具有Age和NumStds属性的类,其中在构造函数中需要Age和NumStds,并创建一个我可以添加到其中的列表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
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();
}