Mayur Ahir Ответов: 3

что быстрее? IEnumerable или список с примером.


public IEnumerable<KeyValuePair<int, string>> GetCity()
{
IEnumerable<KeyValuePair<int, string>> CityList = new List<KeyValuePair<int, string>>();
IEnumerable<City_Mast> objCity = ent.City_Mast.ToList();
CityList = objCity.Select(f => new KeyValuePair<int, string>(f.cid, f.city));
return CityList;
}

 public List<KeyValuePair<int, string>> GetCity()
{
List<KeyValuePair<int, string>> CityList = new List<KeyValuePair<int, string>>();
List<City_Mast> objCity = ent.City_Mast.ToList();
CityList = objCity.Select(f => new KeyValuePair<int, string>(f.cid, f.city)).ToList();
return CityList;
}


Я использовал IEnumerable и список как в приведенном выше примере.
Может ли кто-нибудь сказать мне, какой из них быстрее?
когда использовать IEnumerable и list?

Milfje

Не List просто реализация IList что в свою очередь является реализацией IEnumerable? И зачем использовать List с собой KeyValuePair- А не проще ли было бы воспользоваться Dictionary?

Вот некоторая информация и сравнение между коллекциями: Ссылка

OriginalGriff

Не обязательно: словарь-это специфическая реализация KVP, которая не допускает дублирования значений ключей: список объектов KVP может иметь идентичные ключи.

Milfje

Каждый день-это школьный день. Спасибо, я этого не знал :)

OriginalGriff

Всегда пожалуйста!

Mayur Ahir

На самом деле я новичок в теме интерфейса.
я просто спрашиваю разницу между ними.
можете ли вы рассказать мне о реализации обоих?

Milfje

Привет Маюр, смотрите мой первый пост, в нем есть ссылка с объяснениями о различных "вкусах" коллекций. Там же есть таблица с некоторыми важными сведениями и различиями между ними.

Philippe Mori

Здесь первая реализация не имеет особого смысла. Зачем вам составлять список, чтобы снова превратить его в перечисление?
На практике оба метода должны давать сходный результат, так как они оба использовали список в памяти в качестве промежуточного шага.

3 Ответов

Рейтинг:
24

OriginalGriff

Список-это IEnumerable, через посредника - если вы просматриваете ссылочный источник:

public class List<T> : IList<T>, System.Collections.IList, IReadOnlyList<T>

И объекта IList является
public interface IList<T> : ICollection<T>
И:
public interface ICollection<T> : IEnumerable<T>

Таким образом, в действительности они одинаковы, когда речь заходит о фактическом их использовании, и разница в скорости будет зависеть именно от того, что вы делаете.

В случае вашего кода первый будет значительно быстрее, потому что он не выполняет выбор - он просто настраивает его для последующего выполнения. В отличие от вашего кода списка, который действительно выполняет выбор, потому что использование ToList "сворачивает операцию" и фактически требует, чтобы коллекция была повторена.

Если вы хотите знать, что является самым быстрым, то проверьте его!
В системе есть класс секундомера.Диагностика как раз для этой цели.


Рейтинг:
2

F-ES Sitecore

Это зависит от того, что делает ваш вызывающий код. IEnumerable-это одноразовый механизм, работающий только вперед, в то время как список находится в памяти и может свободно перемещаться столько, сколько необходимо. Если вызывающий код проходит через каждый город один раз (то есть показывает значения в выпадающем списке), то его нет ни здесь, ни там. Если отображается только один или несколько городов, то IEnumerable лучше, если города просматриваются несколько раз, или переупорядочиваются, или вы делаете несколько выборок\фильтров и т. д., то список лучше.


Рейтинг:
0

a_amarsanaa

так много бесполезных ответов...

позвольте мне объяснить главный вопрос.

1) Если вы повторяете элементы из IEnumerable или списка только один раз, так что оба они одинаковы, никаких различий.

2) Если вы повторяете элементы много раз или получаете один элемент несколько раз, то IEnumerable будет медленным.

Из-за IEnumerable он не содержит result, так что при его использовании создается новый экземпляр result. Это означает, что когда вы обращаетесь к одному и тому же элементу несколько раз, каждый из них будет другим объектом!


Dave Kreskowiak

МММ... Мне неприятно это говорить, но ваш ответ-бесполезный ответ на вопрос, который был задан и на который был дан ответ три года назад.

Разницы в скорости нет, потому что в интерфейсе нет кода. Первоначальный вопрос был похож на вопрос: "насколько быстр автомобиль по сравнению с тем, насколько быстр моторный отсек в нем?"

Вы должны сравнивать реализации интерфейса, а не сам интерфейс.