«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Подробное объяснение метода операции LINQ Полное внешнее соединение

Подробное объяснение метода операции LINQ Полное внешнее соединение

Опубликовано в 2025-03-13
Просматривать:766

How to Perform a Full Outer Join in LINQ?

linq - полное внешнее соединение

]

вопрос:

Как выполнить полное соединение между двумя списками объектов на основе общих полей ключей, гарантируя, что все записи в обоих списках были включены в результат, даже если у них нет соответствующих совпадений в другом списке?

]

Отвечать:

1.

Чтобы реализовать полное внешнее соединение в LINQ, мы можем определить метод пользовательского расширения следующим образом:

]

public static IEnumerable FullOuterJoin(
    this IEnumerable a,
    IEnumerable b,
    Func selectKeyA,
    Func selectKeyB,
    Func projection,
    TA defaultA = default(TA),
    TB defaultB = default(TB),
    IEqualityComparer cmp = null)
{
    cmp = cmp ?? EqualityComparer.Default;
    var alookup = a.ToLookup(selectKeyA, cmp);
    var blookup = b.ToLookup(selectKeyB, cmp);

    var keys = new HashSet(alookup.Select(p => p.Key), cmp);
    keys.UnionWith(blookup.Select(p => p.Key));

    var join = from key in keys
               from xa in alookup[key].DefaultIfEmpty(defaultA)
               from xb in blookup[key].DefaultIfEmpty(defaultB)
               select projection(xa, xb, key);

    return join;
}
2.

В приведенном примере у нас есть два списка:

FirstNames

и LastNames . Чтобы выполнить полное внешнее соединение, мы можем использовать следующий код: ]

var outterjoin = из первых в первых именах Присоединяйтесь к последним в Lastnames на first.id равняется последнему. в темп от последнего в temp.defaultifempty () Выберите новый { id = First! = NULL? FirstName = First! = NULL? Инцидент = последний! = NULL? };
var outerJoin = from first in firstNames
                join last in lastNames
                on first.ID equals last.ID
                into temp
                from last in temp.DefaultIfEmpty()
                select new
                {
                    id = first != null ? first.ID : last.ID,
                    firstname = first != null ? first.Name : string.Empty,
                    surname = last != null ? last.Name : string.Empty
                };
В этом коде используется левое внешнее соединение, где каждая запись в

FirstNames

подключена к первой записи сопоставления в

LastNames и подключается к значению по умолчанию, если совпадение не найдено. Оператор в Temp создает временную коллекцию соответствующих записей в lastnames , что позволяет нам применить defaultifempty () , чтобы убедиться, что записи несоответствия включены. Это на самом деле реализует левое внешнее соединение, а не полное внешнее соединение в полном смысле. Чтобы достичь полного внешнего соединения, вам необходимо использовать метод расширения FullouterJoin , настроенный выше. ] 4. ожидаемый выход для полностью внешнего соединения:

]

id FirstName Lastname -------------------- 1 Джон Доу 2 Сью 3 Smith

ID  FirstName  LastName
--  ---------  --------
1   John       Doe
2   Sue        
3             Smith
для несоответствующего имени и негативного целого числа для несоответствующего идентификатора.

]

6.

время выполнения полностью внешнего соединения составляет O (n M), где n и m - длина двух списков ввода. Это связано с тем, что операция tolouctup () занимает O (n) время, а последующие операции требуют времени O (n M).

]

7.

Эта реализация полностью внешнего соединения в настоящее время не является частью стандарта LINQ, но было рекомендовано включить его в будущие версии. Стандартный LINQ не поддерживает полные внешние соединения и требует пользовательского метода расширения для его реализации.

]

Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3