Итак, у вас есть Companies
, и каждый Company
имеет ноль или более Relations
. Каждый Relation
принадлежит ровно одному Company
, используя внешний ключ CompanyId
.
Ваше требование немного неясно:
Мне нужны все отношения компаний внутри компаний.
blockquote>Немного неясно, что вы хотите.
Company (1) with Name "Acme" has Relations A, B, C Company (2) with Name "Acme" has Relations C, X, Y Company (3) with Name "Other" has Relations D, E, Company (4) with Name "Other" has Relations D, F,
Все отношения всех компаний в вашей последовательности компаний - это A B C D E X Y. Иными словами: все отношения, которые используются любой из компаний. Согласно вашему примеру, это не то, что вы хотите.
Вы также написали:
У меня есть последовательность компаний, в которой есть дубликаты компаний.
blockquote>Очевидно, у вас есть метод, чтобы решить, являются ли две компании фактически одной и той же компанией. Это может быть имя, номер налогоплательщика или что-то еще. То, как вы решите, являются ли две компании одинаковыми, не имеет отношения к этому вопросу. Предположим, у вас есть объект класса, который реализует
IEqualityComparer<Company>
:IEqualityComparer<Company> comparer = ...;
Назад к вашему требованию.
Я думаю, вы хотели сказать, что хотели
Companies
с ихRelations
. Если две компании фактически являются одной и той же компанией, вы хотите, чтобы они были возвращены как одна «Компания со своими отношениями»Итак, в приведенном выше примере вам нужен следующий результат
- Компания с именем «Acme» с отношениями ABCXY
- Компания с именем «Other» с отношениями DEF
Проблема с этим требованием состоит в том, если вы считаете, что две компании равны (например, потому что они имеют одно и то же имя) что вы хотите от свойств компании, которые отличаются? Например: какой идентификатор следует использовать для компании с именем «Acme»?
Несколько решений:
- Это не проблема, две компании равны, только если все свойства равно
- Это не проблема, я не хочу никаких свойств компании
- Это не проблема, я хочу только свойства компании, которые равны. Например, я хочу имя, а не идентификатор
- Мне все равно, какую из равных компаний вы выберете
Из-за этого неполного требования ответ должен быть очень общим , Все ответы будут следующими:
- Найти все «Компании с их отношениями»
- Сгруппировать их по Equal Company
- Выберите части Компании и части Связи, которые вы хочет.
Разница в четырех возможных требованиях, описанных выше, заключается в том, какие части Компании вы выбираете в конце.
Я дам решение наиболее вероятного требования:
- Две компании равны, если они имеют одинаковое название.
- Дайте мне названия компаний со всеми их связями
.
// "I have a List of companies and a List of their Relations" IEnumerable<Company> companies = ... IEnumerable<Relation> relations = ... // I want all Companies with their Relations var result = companies.GroupJoin(relations, // GroupJoin Companies and Relations company => company.Id, // from each Company take the primary key relation => relation.CompanyId, // from each Relation take the foreign key // and all Relations with matching foreign key (company, relationsOfThisCompany) => new { Company = company, Relations = relationsOfThisCompany, }) // Result: a sequence of companies, each with their Relations .GroupBy( // KeySelector: make groups of companies with same Name joinResult => joinResult.Company.Name, // ResultSelector: take the Key (which is the common Name) // with all joinResults of companies with name equal equal to the Key to create the output (companyName, companiesWithThisName => new { Name = key.Name, Relations = companiesWithThisName.Select(company => company.Relations), }, // Comparer: when are two company names equal? StringComparer.CurrentCultureIgnoreCase);
Поскольку у меня было довольно простое определение равенства компаний, я мог использовать уже существующий компаратор равенства, чтобы решить, равны ли две компании.
Преимущество отдельного компаратора для равенства компаний заключается в том, что если в будущем вы решите, что вам нужны другие свойства, чтобы решить, равны ли две компании, например, их налоговый номер вместо названия, этот код не изменится. , Вы сами решаете, будете ли вы использовать концепцию «равенства компаний» достаточно часто, чтобы решить, стоит ли делать специальный сравнитель равенства
Попробуйте этот zwc скрипт:
#! /bin/bash --
for F in "$@"; do
echo "$(zcat -f <"$F" | wc -l) $F"
done