Понимание подзапроса LINQ - PullRequest
0 голосов
/ 26 апреля 2018

Я использовал обычный запрос внутри foreach, чтобы достичь своей цели, но я думаю, что есть лучший способ.

int max = 0;
foreach(Area area in myZoo.AreaList)
{
    max = (from a in area.AnimalList
           select a.ID).Max();
}
return max;

Как я могу использовать чистый LINQ для получения max всех подсписков? (Animal - это List из class Animal внутри AreaList и содержит Int32, называемый ID) лямбда-ответ;)

public class Zoo
{
    public List<Area> AreaList {get; set;}
}

public class Area
{
    public List<Animal> AnimalList {get; set;}
}

public class Animal
{
    public List<int> Id {get; set;}
}

Только краткая форма, чтобы никто не запутался;)

Ответы [ 3 ]

0 голосов
/ 26 апреля 2018

Хотя SelectMany работает, я чувствую, что в этом случае запрос более читабелен.

var max = (from area in myZoo.AreaList
           from animal in area.AnimalList
           from id in animal.Id
           select id).Max();
0 голосов
/ 26 апреля 2018
var max = zoo.AreaList.Max(arl => arl.AnimalList.Max(anl => anl.Id)).Max();

Максимальное значение всех максимальных значений всех AnimalLists и Макс. Из них.

По сути, это то же самое, что и SelectMany у ZoharPeled, за исключением того, что он сглаживает список и берет максимум всех предметов, где я снова и снова беру максимум каждого списка.

0 голосов
/ 26 апреля 2018

Вы ищете вложенное SelectMany.

SelectMany вернет один IEnumerable<T> из множества "внутренних" Ienumerable<T> - поэтому Zoo.SelectMany(a => a.AreaList) вернет один IEnumerable<Area>, содержащий все IEnumerable<Area> из свойства Area - тогда вы делаете это еще раз для List<Animal> в классе Area:

Пример данных:

var zoo = new Zoo() {
    AreaList = new List<Area>()
    {
        new Area() 
        {
            AnimalList = new List<Animal>()
            {
                new Animal() {Id = new List<int>() {1, 2, 3}},
                new Animal() {Id = new List<int>() {4, 5, 6}}
            }
        },
        new Area() 
        {
            AnimalList = new List<Animal>()
            {
                new Animal() {Id = new List<int>() {7, 8, 9}},
                new Animal() {Id = new List<int>() {10, 11}}
            }
        },
    }
};

Запрос Linq:

var max = zoo.AreaList.SelectMany(a => a.AnimalList).SelectMany(a => a.Id).Max();

Console.WriteLine(max);

Результат: 11

В синтаксисе запроса вы можете сделать SelectMany, связав предложения from, как показано в ответе gxp. (Лично я предпочитаю синтаксис цепочки методов, поэтому мне потребовалось некоторое время, чтобы разобраться в этом ...)

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