C# 无法理解此IEnumerable.ToArray()示例
在接下来的几行中,我确实理解了LINQ部分,但当我试图理解最后一行时,我完全麻木了 var roles=from r in db.Role from u in db.User where r.RoleID==u.RoleID && u.UserName==username select new { RoleNames=r.RoleName }; return new string[] {roles.ToArray()[0].RoleNames}; 变量角色的类型为IEnumerable,对吗?它包含RoleNames对象的匿名集合? 最后一行,到字符串[]{roles.ToArray[0].RoleNames}的复杂赋值。 ,角色转换为数组OK,然后幻影索引[0]为什么?然后在结尾RoleNames由角色包含的匿名类型,但这一切如何成为一个字符串数组。 Thx高级版,甚至可以看一眼C# 无法理解此IEnumerable.ToArray()示例,c#,linq,C#,Linq,在接下来的几行中,我确实理解了LINQ部分,但当我试图理解最后一行时,我完全麻木了 var roles=from r in db.Role from u in db.User where r.RoleID==u.RoleID && u.UserName==username select new { Rol
return new string[] {roles.ToArray()[0].RoleNames};
ToArray返回具有RoleNames属性的匿名类型数组。然后索引器[0]返回此数组的第一个元素和属性访问器。RoleNames最终返回其RoleNames属性。这只是一个字符串,但新字符串[]{..}使其成为一个带有单个元素的字符串数组。仅从这段代码很难说,但感觉这段代码并没有达到作者的目的 为什么用户有一个RoleID列?如果用户只能有一个角色,那么没关系。但这段代码似乎暗示用户可以有多个角色。用户表是否包含每个用户的多个条目,每个条目都有一个分配的角色?用户/角色通常是多对多关系 原始作者获取该查询的结果,然后只获取该查询的第一个结果(在这种情况下是对角色的调用)。首先可能更合适,然后在那里获取一个角色并以数组形式返回它。若这个数组只有一个元素,那个么这是可以的,但感觉不对。如果作者想要多个角色,他们只会得到一个。更不用说如果找不到任何角色,这段代码就会爆炸 如果一个用户实际上只能有一个角色,那么有更简单、更容易阅读的方法来获得该角色。可能是这样的:
var roles=from r in db.Role
from u in db.User
where r.RoleID==u.RoleID
&& u.UserName==username
select r.RoleName;
// at this point roles will probably have zero or one entry, so you can do
return roles.FirstOrDefault(); // return the one role found as a string
// or null if none were
// or if you really do want the array
return roles.ToArray(); // will return a string array,
// possibly having 1 or 0 elements
我不相信它能按预期工作 它只返回第一个匹配的角色名 相反,代码应该是
var roles=(from r in db.Role
from u in db.User
where r.RoleID==u.RoleID
&& u.UserName==username
select r.RoleName).ToArray();
return roles;
事实证明,这正是公认答案中所描述的
如果用户只能有一个角色,并且可以保证他们有一个有效的角色ID,并且调用代码需要一个数组,那么此代码将按预期工作,但这并不是最简单的方法。最后一行将查询实现为数组,然后只需要数组的第一项,并从该项的RoleNames属性创建一个新的字符串数组 更好的解决方案是只获取RoleName属性的值,而不是使用包含它的属性创建新对象:
var roles =
from r in db.Role
from u in db.User
where r.RoleID == u.RoleID && u.UserName == username
select r.RoleName;
由于roles是一个IEnumerable,您可以使用Take方法将结果限制为第一个字符串,然后将其转换为数组
return roles.Take(1).ToArray();
由于在使用ToArray方法实现之前限制了结果,因此它只需要读取第一项,而不是读取所有项,然后丢弃除第一项之外的所有内容
为什么单个字符串应该作为数组返回并不明显。如果这是一个错误,它实际上应该返回所有角色名,只需从代码中删除Take1即可。是的,伙计,你清除了所有角色名!在我的解决方案中,“用户”只有一个“角色”,但这段代码的作者肯定是AnySolution guy:您为我提供了自定义角色提供程序中的“GetRolesForUser”方法的解决方案,我正在使用该方法用于ASP.NET MVC应用程序。Thx分配用于清除此。回到实验室:Thx,这很有趣。在这个论坛上我可以学到很多东西: