Linq将IEnumerable(Of Struct)加入IEnumerable(对象)

时间:2009-05-21 23:45:14

标签: linq join linq-to-objects

使用类RoleRecord(Guid RoleId,string RoleName,...)我正在尝试获取NameI的新列表,其中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 个答案:

答案 0 :(得分:5)

如果你有大量的Guids,我个人不会使用Jeremy的回答。如果您真正想要表达联系 - 您只需要:

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

或者,首先创建一组角色ID:

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

优点是,您无需对每个角色的每个有效角色ID进行线性搜索。如果您知道您没有多个角色或角色ID,那么这不是问题,但通常哈希方法会更有效。

请注意,连接内部也会使用哈希值。

答案 1 :(得分:3)

尝试一下:

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