我有一个包含List<>
个对象的类。对于这个例子,我会说对象是一个基本类,如下所示:
public class City
{
private string name;
private string country;
public string Name
{
get
{
return name;
}
set
{
name = value;
}
}
}
通常我会像这样引用这些对象:
List<City> theList = new List<City>();
City theCity = theList[0];
我想做的是如下列表:
List<City> theList = new List<City>();
City theCity = theList["London"];
伦敦是其中一个城市的名称财产。
我如何实现这一目标?目前我一直在构建&#34;发现&#34;输入让我回答相关城市的方法。我需要的是能够通过Key引用。
答案 0 :(得分:9)
基本上,听起来你想要一个Dictionary<string, City>
而不是List<City>
。您可以使用LINQ轻松创建它:
var dictionary = list.ToDictionary(city => city.Name);
如果你真的想要保留订单,你可以使用一个列表并搜索它(根据Ethan的答案),但如果只需要按名称查找,那么字典就是什么你想要的。
答案 1 :(得分:3)
您可以使用LINQ:
List<City> theList = new List<City>();
City theCity = theList.FirstOrDefault( x => x.Name == "London" );
答案 2 :(得分:3)
您编写一个包装器List类CityList并重载[]运算符。
public class City
{
private string name;
private string country;
public City(string cityName)
{
Name = cityName;
}
public string Name
{
get
{
return name;
}
set
{
name = value;
}
}
}
public class CityList : CollectionBase
{
public CityList() : base ()
{
}
public City this[int index]
{
get
{
return (City)List[index];
}
set
{
List[index] = value;
}
}
public City this[string name]
{
get
{
int index = this.IndexOf(name);
if (index < 0 || index >= this.List.Count) return null; // or assert
return (City)List[index];
}
set
{
int index = this.IndexOf(name);
if (index > 0 || index >= this.List.Count) return; // or assert
List[index] = value;
}
}
public virtual int IndexOf(City city)
{
return List.IndexOf(city);
}
public virtual int IndexOf(string name)
{
if (name == null) return -1;
for (int i = 0; i < List.Count; i++)
{
if (((City)List[i]).Name.ToLower() == name.ToLower())
return i;
}
return -1;
}
public virtual void Insert(int index, City city)
{
List.Insert(index, city);
}
public virtual int Add(City city)
{
return base.List.Add(city);
}
}
class Program
{
static void Main()
{
City NewYork = new City("New York");
City Boston = new City("Boston");
City Tampa = new City("Tampa");
CityList cities = new CityList();
cities.Add(NewYork);
cities.Add(Boston);
cities.Add(Tampa);
Console.WriteLine(cities["Boston"].Name); // prints "Boston"
Console.ReadKey();
}
}
现在可能有一种更流畅的方式,所以你不需要施法。这就像.NET 2.0代码。
答案 3 :(得分:0)
System.Collections.ObjectModel.KeyedCollection
怎么样?