LINQ выдает все элементы - PullRequest
       12

LINQ выдает все элементы

0 голосов
/ 02 января 2019

Когда я хочу получить IEnumerable для полной материализации / выдачи всех его результатов, я обычно использую ToList() следующим образом:

var myList= new List<int>();
IEnumerable<int> myXs = myList.Select(item => item.x).ToList();

Я обычно делаю это, когда блокирую метод, возвращающий результат Linqquery.

В таких случаях я не заинтересован в том, чтобы коллекция стала списком, и я часто не хочу знать, что это за тип.Я просто использую ToList () для его побочного эффекта - получая все элементы.

Если, например, если я изменю тип с List на Array, мне также придется помнить, чтобы изменить ToList () на ToArray() или потерпеть некоторый удар производительности.

Я могу сделать foreach( var e in myList ) { }, но я не уверен, будет ли это оптимизировано в какой-то момент?

Я ищу что-то вроде myList.Select(item => item.x).yield()

Как лучше всего это сделать?Есть ли способ просто сообщить результат Linq для получения всех его элементов, который лучше, чем ToList?

Ответы [ 2 ]

0 голосов
/ 02 января 2019

Просто к вашему сведению, так как, возможно, это проблема

Вам не нужно писать операции LINQ в одну строку, вы можете расширять ее все больше и больше:

Например:

var myList = new List<T>();
var result = myList.Select(x => x.Foo).Where(x => x.City == "Vienna").Where(x => x.Big == true).ToList();

Может быть переписано:

var myList = new List<T>();

//get an IEnumerable<Foo>
var foos = myList.Select(x => x.Foo);

//get an IEnumerable<Foo> which is filtered by the City Vienna
var foosByCity = foos.Where(x => x.City == "Vienna");

//get an IEnumerable<Foo> which is futher filtered by Big == true
var foosByCityByBig = foosByCity.Where(x => x.Big == true);

//now you could call to list on the last IEnumerable, but you dont have to
var result = foosByCityByBig.ToList();

Итак, какой бы ни была ваша реальная цель, может быть, вы можете изменить свою линию

var myList= new List<int>();
IEnumerable<int> myXs = myList.Select(item => item.x).ToList();

К этому:

var myList= new List<int>();
IEnumerable<int> myXs = myList.Select(item => item.x);

И продолжить работу с myXs как IEnumerable<int>.

0 голосов
/ 02 января 2019

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

Если вы действительно заинтересованы в результатах, в большинстве случаев вам просто нужно использовать ToList () и не переусердствовать.

Нет способа избежать выделения какого-либо хранилища, если вы хотите получить результаты позже. Нет волшебного IEnumerable<T> контейнера, который не имеет конкретного типа; Вы должны выбрать один, и ToList() является наиболее очевидным выбором с низкими издержками.

Не забудьте ToListAsync () , если вы не хотите ждать его завершения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...