Правда ли что LINQ нельзя использовать в Unity?

insert_comment 5
visibility 1016
|
19.06.2020

Linq был введен в C# 3 в 2007 году, и с тех пор прошло уже не мало времени. Этот язык был отлично принят разработчиками, и смог изменить подход к решению многих задач, связанных сданными. Что же это такое и правда ли, что его нельзя использовать в Unity?

Что вообще такое LINQ?

LINQ или же Language Integrated Query — это простой и, самое главное, удобный язык запросов к источникам данных. Традиционно запросы реализовывались в качестве обычных строк без поддержки проверки типов и IntelliSense, также разработчику приходилось изучать разные языки запроса для разных типов данных. Получается, что его цель заключается в том, чтобы обеспечить простоту написания запросов ко многим источникам данных с согласованным синтаксисом и возможностями, а также в пригодном для чтения и компоновки стиле.

Разберем на примере удобство LINQ.
У нас есть массив товаров, и я хочу получить все товары цена, которых выше определенного значения.

Без использования LINQ

Правда ли что LINQ нельзя использовать в Unity?, изображение №1
 

С использованием LINQ

Правда ли что LINQ нельзя использовать в Unity?, изображение №2
 

Наш запрос состоит из 3 частей, каждая часть специально отделена переносом строки. form - означает выборку данных, where — применение фильтра, select — задает возвращаемый элемент.

Как мы можем видеть, с использованием LINQ, код понимать намного проще, а также припомощи одного и того же запроса мы можем обратиться к разным источникам данных.

Как устроен LINQ?

В C# у нас есть такая вещь, как последовательность, она инкапсулирована интерфейсом IEnumerable. Последовательности, по сути своей, это конвейер с элементами. Мы обрабатываем по одному элементу за раз, пока не закончатся данные. Ключевое отличие между последовательностью и массивами или листами в том, что при чтении последовательности мы,как правило, не знаем о том, сколько ещё элементов нас ожидают, а также мы можем получить доступ только к текущему элементу, мы не можем получить доступ к какому-то случайному.

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

На данной картинке мы можем видеть, как последовательность трансформируется по мере выполнения запроса.

Правда ли что LINQ нельзя использовать в Unity?, изображение №3
 

Каждая стрелка — это последовательность, описание которой в левой части, а получившиеся данные справа. Каждый блок — это шаг внутри выражения запроса.
Изначально у нас имелась последовательность из 3 товаров. После фильтрации у нас остались только те товары, у которых цена выше 5000 и финальная коллекция состоит как раз из полученных данных.

Результатом выполнения этого запроса будут являться не продукты, а IEnumerable<Product>, который при последующих запросах или переборе выдаст все полученные элементы друг за другом, сначала C# Базовый, а после Unity базовый.

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

Тут всё не так просто как кажется, мы идем не сверху вниз от from до select, а наоборот, мы начинаем обработку именно от select. В этом нам поможет разобраться диаграмма последовательностей.

Правда ли что LINQ нельзя использовать в Unity?, изображение №4
 

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

В чём же кроется проблема?

Слух о том, что LINQ опасный и много жрет, по большей части, исходит от неопытных программистов. Неопытный программист помещает достаточно большой запрос в Update. Мы уже знаем как устроен Linq, и по этой причине понимаем, что в этом и кроется проблема. Запросы, как правило намного больше, чем тот, который мы рассмотрели в рамках статьи, по этой причине создание запроса каждый кадр, конечно же, будет нагружать ваш проект, ведь это вызывает множество ненужных аллокаций.

Как итог мы можем сказать, что LINQ это очень удобный язык запросов, который можно и нужно использовать, но как и любой другой инструмент использовать его нужно с умом и пониманием!

В скором времени в наш курс C# Базовый будет добавлена глава по LINQ, в которой мы разберемся с особенностями этого языка, изучим на примерах всевозможные операции и научимся правильно его применять!

Как итог, мы можем сказать, что LINQ это очень удобный язык запросов, который можно и нужно использовать, но, как и любой другой инструмент, использовать его нужно с умом и пониманием!

Обучение с нуля до первой зарплаты— http://ijunior.ru/unity-start?utm_source=vk&utm_medium=article&utm_campaign=ijunior&utm_LINQinUnity

7 курсов бесплатно

Начните карьеру разработчика игр бесплатно!


    Комментарии
    Андрей Сученинов
    Исправьте ошибки в тексте =) ( form - означает выборку данных, а также припомощи одного) и т.д.
    insert_comment 0
    |
    Ответить
    Александр Воробёв
    Как итог, мы можем сказать, что LINQ это очень удобный язык запросов, который можно и нужно использовать, но, как и любой другой инструмент, использовать его нужно с умом и пониманием! (c) фраза используется 2 раза подряд.
    insert_comment 0
    |
    Ответить
    Михаил Анкудинов
    Статья — огонь! Спасибо!
    insert_comment 0
    |
    Ответить
    Остальные комментарии


    Отзывы