#c_sharp #linq
Подскажите пожалуйста в чем преимущество использования в Linq запросе комбинации Join+Into перед group. Что один, что второй используются для группировки сходных по определенных критериев объектов в массив. Однако зачем использовать Join+Into если, все сортировочные критерии есть и так в нужном массиве. Например есть две последовательности: Listtype = new List () { 1,2,3,4 }; List classes = new List () { new Tov(4, "Велосипед"), new Tov(1, "Автомобиль"), new Tov(2, "Катер"), new Tov(4, "Мопед"), new Tov(3, "Самолет"), new Tov(2, "Лодка"), new Tov(1, "Самосвал"), new Tov(4, "Самокат"), new Tov(2, "Корабль"), }; В чем преимущество, например этого запроса var v = from t in classes group t by t.id; От этого : var v = from t in type join cl in classes on t equals cl.id into Mass select new { Type = t, Mass }; Ведь в результате мы все равно как в первом так и во втором случае получим набор из массивов где объекты определены по одному признаку. И есть ли такой пример, где невозможно воспользоваться одним способом, зато можно другим ? Спасибо.
Ответы
Ответ 1
Group by - это аггрегация данных, т.е. результат будет содержать столько же или меньше (в случае повтороения значений) строк. Join - это содениение данных, т.е. результат будет содержать столько же и никак не меньше строк. Если в список type будут повторяющиеся значения, то результат второго запроса поменяется. Для такого списка: var type = new List() { 1, 2, 3, 4, 3 , 2, 1 }; Второй запрос вернет семь строк, а не 4 как первый. DotNetFiddle пример В другом случае, когда не для каждого значения id из списка type будут существовать соответствующие значения в списке classes - во втором запросе, для каждого такого значения id из списка type вернется пустой список значений из classes. DotNetFiddle пример Ответ 2
Пример, когда один сработает, а другой - нет. Немного модифицируем исходные данные, а именно - уберем из классов тип 3: new Tov(3, "Самолет"): Listtype = new List () { 1,2,3,4 }; List classes = new List () { new Tov(4, "Велосипед"), new Tov(1, "Автомобиль"), new Tov(2, "Катер"), new Tov(4, "Мопед"), new Tov(2, "Лодка"), new Tov(1, "Самосвал"), new Tov(4, "Самокат"), new Tov(2, "Корабль"), }; Первый запрос вернет только те типы, которые есть в classes - 1,2,4. Второй - все типы. В т.ч. и тип 3, для которого ни одного класса нет. Что применять - зависит от целей. Например, нужно проверить что у всех типов есть хотя бы один класс. Тогда нам не подойдет первый запрос. А если в type будут не уникальные данные - нам не подойдет второй запрос, если нужно избежать "задвоения" данных. Так что по ситуации.
Комментариев нет:
Отправить комментарий