2015-08-26 4 views
2

В приведенном ниже коде, это более эффективно (с точки зрения памяти и времени), чтобы создать List<string> непосредственно, а не создавать string[] и вызов ToList() на него, прежде чем передать его SomeMethod()?Создание массива Vs Список

При создании string[] и вызвать ToList(), будет ли это создать List<string> объект, а также уже имеющие string[]?

Я спрашиваю, что я видел код, где они создают string[] и вызывая ToList() перед передачей его в качестве аргумента метода с параметром List<string>, и я не был уверен, есть ли какая-либо конкретная причина что.

class Program 
    { 
     static void Main(string[] args) 
     {    
      var array = new string[] { "str1", "str2" }; 
      SomeMethod(array.ToList()); 
      var list = new List<string> { "str1", "str2" }; 
      SomeMethod(list);       
     } 

     static void SomeMethod(List<string> list) 
     { 
      //do stuff 
     } 
    } 
+2

Вы говорите об эффективности времени или эффективности памяти? – Dodo

+0

Меня интересуют как время, так и эффективность памяти. –

+0

уверен, что создание строки [] и вызов ToList() потеряли бы с точки зрения эффективности времени и памяти? Я не могу понять, почему этот код использовался в производстве. Это было написано опытным разработчиком. –

ответ

10
  1. Каждый .ToList() и .ToArray() создает новые объекты, выделяет память, копирует значения. Итак, попытайтесь свести к минимуму такие операции
  2. Используйте более распространенные типы: IEnumerable, ICollection. Так как список и массив подходят для IEnumerable, например:

class Program 
{ 
    static void Main(string[] args) 
    {    
     var array = new string[] { "str1", "str2" }; 
     SomeMethod(array); 
     var list = new List<string> { "str1", "str2" }; 
     SomeMethod(list);       
    } 

    static void SomeMethod(IEnumerable<string> list) 
    { 
     //do stuff 
    } 
} 

Справочник.

ToArray Метод Список:

public T[] ToArray() 
{ 
    T[] objArray = new T[this._size]; 
    Array.Copy((Array) this._items, 0, (Array) objArray, 0, this._size); 
    return objArray; 
} 

Вы можете увидеть, что копии данных.

метод ToList:

public static List<TSource> ToList<TSource>(this IEnumerable<TSource> source) 
{ 
    if (source == null) 
    throw Error.ArgumentNull("source"); 
    return new List<TSource>(source); 
} 

Вы можете видеть, он создает новый объект списка. А конструктор List(IEnumerable<T> collection) копирует данные.

0

Я бы ожидать, что она будет меньше памяти идти прямо к List, но время будет зависеть от внутренней работы. ToList, вероятно, состоит из создания списка, а затем перемещения данных из массива, однако, что кажется неэффективным с точки зрения времени.

Попробуйте выполнить некоторые тесты, выполняющие каждый метод 100000 или около того, и посмотрите, сколько времени это занимает в каждом тесте.

+2

1000, вероятно, недостаточно для этого размера данных. Попробуйте несколько сотен тысяч. –

+0

Это зависит от того, насколько трагически медленный компьютер. Проверьте, какой тест работает хорошо ... – Dodo

Смежные вопросы