【问题标题】:Out of range in searching function?搜索功能超出范围?
【发布时间】:2013-07-16 00:44:03
【问题描述】:
    public static int PlanetToIndex(string planetToSearch, List<Planet> pl)
    {
        for (int i = 0; i < pl.Capacity; i++) // out of range...
            if (pl[i].Equals(planetToSearch))
                return i;

        return -1;
    }

它的C#简单搜索功能,好像Capacity = 16,但是范围超出了14...

14是正确的值,为什么MessageBox显示16?!

另外,你列出了我传递给函数的内容(Planet 是抽象类)

class Galaxy
{
    public List<Planet> galaxy = new List<Planet>();
    Planet Ceres = new Planet.Ceres();
    Planet Pluto = new Planet.Pluto();
    Planet Europa = new Planet.Europa();
    Planet Venus = new Planet.Venus();
    Planet Sedna = new Planet.Sedna();
    Planet Jupiter = new Planet.Jupiter();
    Planet Void = new Planet.Void();
    Planet Eris = new Planet.Eris();
    Planet Mars = new Planet.Mars();
    Planet Uranus = new Planet.Uranus();
    Planet Neptune = new Planet.Neptune();
    Planet Saturn = new Planet.Saturn();
    Planet Earth = new Planet.Earth();
    Planet Mercury = new Planet.Mercury();

    public Galaxy()
    {
        galaxy.Add(Ceres);
        galaxy.Add(Pluto);
        galaxy.Add(Europa);
        galaxy.Add(Venus);
        galaxy.Add(Sedna);
        galaxy.Add(Jupiter);
        galaxy.Add(Void);
        galaxy.Add(Eris);
        galaxy.Add(Mars);
        galaxy.Add(Uranus);
        galaxy.Add(Neptune);
        galaxy.Add(Saturn);
        galaxy.Add(Earth);
        galaxy.Add(Mercury);
    }
}

【问题讨论】:

    标签: c# list search range


    【解决方案1】:

    容量与计数不同。试试这个:

    for (int i = 0; i < pl.Count; i++)
        if (pl[i].Equals(planetToSearch))
            return i;
    

    或者更好:

    return pl.FindIndex(planet => planet.Equals(planetToSearch));
    

    【讨论】:

      【解决方案2】:

      我想你想使用pl.Count,而不是pl.Capacity

      Capacity 是内部数据结构在不调整大小的情况下可以容纳的元素总数。而Count 是列表中实际包含的元素数。

      【讨论】:

        【解决方案3】:

        在你的for循环中,你需要使用

        for (int i = 0; i < pl.Count; i++)
        

        容量是它有空间可存储的元素数量。试试这个,看看有什么区别:

                List<int> intlist = new List<int>();
                intlist.Capacity = 32;
                Console.WriteLine(intlist.Count);
                Console.WriteLine(intlist.Capacity);
                Console.In.Read();
        

        输出是 0 和 32。因为数组中实际上没有元素,而是 32 个元素的空间。

        【讨论】:

          【解决方案4】:

          我会推荐使用计数

           for (int i = 0; i < pl.Count(); i++) 
          

          【讨论】:

          • 哇...是的,这解释了一切...
          【解决方案5】:

          与大小固定的数组不同,List会随着它的增长而调整大小。 List&lt;T&gt;.Capacity 是允许您在需要调整大小之前获取/设置列表大小的属性。

          See MSDN List.Capacity:

          Capacity 是在需要调整大小之前 List 可以存储的元素数,而 Count 是 List 中实际存在的元素数。 容量总是大于或等于计数。如果在添加元素时 Count 超过了容量,则通过在复制旧元素和添加新元素之前自动重新分配内部数组来增加容量。

          因此,在您的示例中,Capacity > Count

          【讨论】:

            猜你喜欢
            • 2015-09-25
            • 2018-07-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-03-29
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多