Linq Присоединение IEnumerable (Of Struct) к IEnumerable (of object) - PullRequest
2 голосов
/ 22 мая 2009

С помощью класса RoleRecord (Guid RoleId, строка RoleName, ...) я пытаюсь получить новый список имен, где RoleId соответствует списку Guid

IEnumerable<RoleRecord> roles;
IEnumerable<Guid> roleIds;

Я думал о том, чтобы избежать вложенных циклов for, и в соответствии с:

            var query = 
            from rowA in roles
            join rowB in roleIds
            on rowA.RoleId equals rowB.????
            select { rowA.RoleName };

Я тоже пытался обернуть guid в классе, но не могу даже построить его, потому что синтаксис неправильный. Есть идеи? Спасибо

Ответы [ 2 ]

5 голосов
/ 22 мая 2009

Я бы лично не использовал бы ответ Джереми, если у вас есть значительное количество гидов. Если объединение - это то, что вы действительно хотите выразить - вам просто нужно:

var query = from rowA in roles
            join rowB in roleIds on rowA.RoleId equals rowB
            select rowA.RoleName;

Либо сначала создайте набор идентификаторов ролей:

HashSet<Guid> validRoleIds = new HashSet<Guid>(roleIds);
var query = from rowA in roles
            where validRoleIds.Contains(rowA.RoleId)
            select rowA.RoleName;

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

Обратите внимание, что объединение будет также использовать внутренний хеш.

3 голосов
/ 22 мая 2009

Попробуйте:

var query = 
            from rowA in roles
            where roleIds.Contains(rowA.RoleId)
            select  rowA.RoleName;
...