如何通过Key引用列表<object>中的项而不是索引?</object>

时间:2012-05-23 19:21:03

标签: c# list key

我有一个包含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引用。

4 个答案:

答案 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怎么样?

http://msdn.microsoft.com/en-us/library/ms132438.aspx