例如,我在我的应用程序中有一个类型列表,其中包含一个人名作为名称,并包含两个值。类型的名称是人员姓名,类型仅包含他们的年龄和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)
答案 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();
}