Страницы

Поиск по вопросам

пятница, 10 января 2020 г.

Linq Group VS Join+Into

#c_sharp #linq


Подскажите пожалуйста в чем преимущество использования в Linq запросе комбинации
Join+Into перед group. Что один, что второй используются для группировки сходных по
определенных критериев объектов в массив. Однако зачем использовать Join+Into если,
все сортировочные критерии есть и так в нужном массиве. Например есть две последовательности:

        List type = 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, "Самолет"): List type = 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 будут не уникальные данные - нам не подойдет второй запрос, если нужно избежать "задвоения" данных. Так что по ситуации.

Комментариев нет:

Отправить комментарий