Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法理解此IEnumerable.ToArray()示例_C#_Linq - Fatal编程技术网

C# 无法理解此IEnumerable.ToArray()示例

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

在接下来的几行中,我确实理解了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高级版,甚至可以看一眼

 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,这很有趣。在这个论坛上我可以学到很多东西: