Какой самый эффективный способ иметь метод, который принимает индексируемый список любого типа в c # - PullRequest
0 голосов
/ 20 ноября 2018

Я хочу иметь возможность редактировать любой или большинство типов общих списков, использующих индексатор в C #, например:

void testIList(System.Collections.IList someList)
{
    for (int i = 0; i < someList.Count; i++)
    {
        someList[i] = someList.Count - i;
    }
}

void test()
{
    int[] intArray = new int[10];
    List<int> intList = new List<int>();
    List<string> stringList = new List<string>();

    for(int i=0;i<10;i++)
    {
        intList.Add(0);
        stringList.Add("test");
    }

    testIList(intArray);
    testIList(intList);

    testIList(stringList);
}

Код работает, но, конечно, нет ошибки времени компиляциидля testIList (stringList), что нежелательно.

Кроме того, есть ли в testIList бокс и распаковка, которых я могу избежать, используя более конкретную универсальную коллекцию в качестве типа в параметре?

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Вы можете использовать интерфейс System.Collections.Generic.IList<T>, чтобы разрешить только те коллекции, которые реализуют это, которые будут List<int>, int[] и некоторые другие.Он не позволяет использовать неуниверсальный тип списка, такой как ArrayList или List<object> (с которым будет работать ваш текущий код), но чаще это хорошая вещь, а не плохая.

void TestIList(IList<int> someList)
{
    for (int i = 0; i < someList.Count; i++)
    {
        someList[i] = someList.Count - i;
    }
}
0 голосов
/ 20 ноября 2018

Используйте универсальный интерфейс для IList: IList<T>:

void testIList<T>(System.Collections.Generic.IList<T> someList)
{
    for (int i = 0; i < someList.Count; i++)
    {
        someList[i] = default(T);
    }
}

Конечно, вы должны сами выяснить, какова логика для определения значения для установки элементов списка, ноdefault(T) покажет, что код работает.

...