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