在C#中动态增加索引器的大小

时间:2018-04-06 14:53:05

标签: c# indexer

使用https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/indexers/indexers-in-interfaces 如果我有一个索引器,我从一个大小为1的数组开始。有一种方法可以在新的更新到来时更改数组的大小,或者我自己必须这样做。

// Indexer on an interface:
public interface ISomeInterface
{
    // Indexer declaration:
    int this[int index]
    {
        get;
        set;
    }
}

// Implementing the interface.
class IndexerClass : ISomeInterface
{
    private int[] arr = new int[10];
    public int this[int index]   // indexer declaration
    {
        get
        {
            // The arr object will throw IndexOutOfRange exception.
            return arr[index];
        }
        set
        {
            arr[index] = value;
        }
    }
}

class MainClass
{
    static void Main()
    {
        IndexerClass test = new IndexerClass();
        System.Random rand = new System.Random();
        // Call the indexer to initialize its elements.
        for (int i = 0; i < 10; i++)
        {
            test[i] = rand.Next();
        }
        for (int i = 0; i < 10; i++)
        {
            System.Console.WriteLine("Element #{0} = {1}", i, test[i]);
        }

        // Keep the console window open in debug mode.
        System.Console.WriteLine("Press any key to exit.");
        System.Console.ReadKey();
    }
}

自己动手我可能会使用类似的代码:

    // Increases the size of the item array.
protected void IncreaseCapacity()
{
    int size = arr.Length++;
    object [] oldArray = arr;
    arr = new object[size];
    oldArray.CopyTo(_items, 0);
}

虽然这并不令人难以置信!

更新在界面中执行类似的操作,以便我可以按时间或索引进行搜索:

double this[DateTime dateTime, Data data]
    {
        get;
    }
    double this[int index, Data data]
    {
        get;
    }

1 个答案:

答案 0 :(得分:2)

你是对的,效率并不高,因为每次添加元素时都必须分配新的内存。不要自己实现。请使用类似List<T>的内容。它有时也必须分配新的内存,但它很聪明:每次重新分配也会分配一些额外的空间,以防万一需要它,这意味着重新分配需要不那么频繁地完成。

或者,根据您的实际使用情况,您可能会考虑使用不同类型的数据结构,例如linked list,这样可以避免在添加新元素时复制现有元素,但代价是不再具有常量 - 时间随机访问(有时这是好的,有时不是)。 C#有LinkedList<T>

最后,我想指出这与索引器无关,索引器与这个问题实际上并不相关。索引器根本没有“大小”,您只需提供一个接受索引参数的访问器方法。由您来决定如何处理这些索引参数以及是否以及如何进行边界检查等。