C# IEnumerable到IList之间的转换(简洁的返回结果)

C# IEnumerable到IList之间的转换(简洁的返回结果),c#,.net,asp.net-mvc,dapper,C#,.net,Asp.net Mvc,Dapper,有UserManager方法的签名(ASP.NET Identity核心默认实现): public任务GetRolesAsync(用户){ 常量字符串查询=@“ 选择r.[名称] 来自[UserRoles]ur 在r.RoleId=ur.RoleId上左连接[Roles]r 其中ur.UserId=@UserId; "; 返回Task.Factory.StartNew(()=>{ 正在使用(SqlConnection=newsqlconnection(_connectionString)) 返回

UserManager
方法的签名(ASP.NET Identity核心默认实现):

public任务GetRolesAsync(用户){
常量字符串查询=@“
选择r.[名称]
来自[UserRoles]ur
在r.RoleId=ur.RoleId上左连接[Roles]r
其中ur.UserId=@UserId;
";
返回Task.Factory.StartNew(()=>{
正在使用(SqlConnection=newsqlconnection(_connectionString))
返回connection.Query(查询,new{userId=user.userId});
});
}
但不幸的是
Dapper.Query
返回
IEnumerable

是否可以返回
IList
或我必须自己进行转换?

只需调用
.ToList()

return connection.Query<string>(query, new { userId = user.UserId }).ToList();
返回connection.Query(Query,new{userId=user.userId}).ToList();

这将枚举
IEnumerable
,并创建作为
列表找到的所有元素的内存副本

尝试使用显式转换

return (IList<string>)connection.Query<string>(query, new { userId = user.UserId });
return(IList)connection.Query(Query,new{userId=user.userId});

Dapper只保证给您一个
IEnumerable
。所以你只能假设。特别是,它已经有了不同的场景,可以为您提供一个填充列表、一个延迟迭代器

最简单的方法就是调用
.ToList()
。如果您打算避免alloc,那么可以进行推测测试:

static IList<T> SpeculativeToList<T>(this IEnumerable<T> source)
{
    return source as IList<T> ?? source.ToList();
}
静态IList推测列表(此IEnumerable源代码)
{
返回源为IList??source.ToList();
}

无法将类型“List>”隐式转换为“IList>”@FSou1:您确定这就是错误的范围和整体问题吗?
列表
可以隐式转换为
IList
。例如,这是有效的:
IList Test(){return new List();}
Yeah,正如我在错误列表和任何操作中看到的那样。隐式转换按预期正确运行。@FSou1我是主要作者之一,我不同意;)不能保证你的演员阵容会一直有效。这很容易引发异常。托利斯特更安全。
static IList<T> SpeculativeToList<T>(this IEnumerable<T> source)
{
    return source as IList<T> ?? source.ToList();
}