联接两个集合

本文关键字:两个 集合 | 更新日期: 2023-09-27 18:06:21

我有一个包含idname的集合persons:

Dictionary<int, string> persons;

1约翰
2去核机
3 Carl

然后我有一个按组织的人员id集合:

IDictionary<int, IEnumerable<int>> workers;

100 - [1,2]
101 - []
102 - [3]

最后是只包含OrganizationId:

的主实体
entity.OrganizationId = 100;

我需要遍历workers并获得人员的所有id(它将给出:1,2),最后从persons获得这些人员的名称。我该怎么做呢?

联接两个集合

如果您只想要这个特定OrganisationId中的人员:

var personsFromOrganisation = workers[OrganizationId].Select(i => persons[i]);

如果您想要一个对象直接将所有OrganisationId关联到相应的人员(这里使用字典):

var organisationsIds = entities.Select(e => e.OrganisationId).Distinct();
var personsByOrganisation = organisationsIds.ToDictionary(id => id, id => workers[id].Select(pid => persons[pid]));

不需要LINQ获取ID:

IEnumerable<int> orgWorkers = null;
bool containsOrg = workers.TryGetValue(entity.OrganizationId, out orgWorkers);

现在获取名称就很简单了:

List<string> workerNames = new List<string>();
if(containsOrg)
{
    workerNames = orgWorkers
        .Where(id => persons.ContainsKey(id))
        .Select(id => persons[id])
        .ToList();
}

您可以使用子查询获得所需的id,然后通过该连接:

var personsByOrganization =
        from p in persons
        join id in workers.Where(x => x.Key == entity.OrganizationId)
                          .SelectMany(x => x.Value)
        on p.Key equals id
        select p;

No-Join方法:

HashSet<int> Ids = new HashSet<int>(workers.Where(x => x.Key == entity.OrganizationId)
                                           .SelectMany(x => x.Value));
Dictionary<int, string> personsByOrganization =
        persons.Where(x => Ids.Contains(x.Key))
               .ToDictionary(x => x.Key, x => x.Value);