вопрос:
Как выполнить полное соединение между двумя списками объектов на основе общих полей ключей, гарантируя, что все записи в обоих списках были включены в результат, даже если у них нет соответствующих совпадений в другом списке?
]Отвечать:
]
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.
и LastNames
. Чтобы выполнить полное внешнее соединение, мы можем использовать следующий код: ]
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
};
В этом коде используется левое внешнее соединение, где каждая запись в LastNames и подключается к значению по умолчанию, если совпадение не найдено. Оператор
в Temp создает временную коллекцию соответствующих записей в
lastnames , что позволяет нам применить
defaultifempty () , чтобы убедиться, что записи несоответствия включены. Это на самом деле реализует левое внешнее соединение, а не полное внешнее соединение в полном смысле. Чтобы достичь полного внешнего соединения, вам необходимо использовать метод расширения
FullouterJoin , настроенный выше.
]
4.
ожидаемый выход для полностью внешнего соединения:
ID FirstName LastName
-- --------- --------
1 John Doe
2 Sue
3 Smith
для несоответствующего имени и негативного целого числа для несоответствующего идентификатора. время выполнения полностью внешнего соединения составляет O (n M), где n и m - длина двух списков ввода. Это связано с тем, что операция tolouctup ()
занимает O (n) время, а последующие операции требуют времени O (n M).
]
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3