[英]How do I convert a non-Generic IList to IList<T>?
我有想要IList<T>
,但是我有一个来自NHibernate队列的Systems.Collection.IList
。
我想创建一个将其转换为IList<T>
。 我该怎么做呢?
如果您确定所有元素都继承自T(或您使用的任何类型)
IList<T> myList = nonGenericList.Cast<T>().ToList();
如果您不确定:
IList<T> myList = nonGenericList.OfType<T>().ToList();
当然,您将需要System.Linq命名空间:
using System.Linq;
Cast
和OfType
返回IEnumerable<T>
实现,而不是IList<T>
实现,因此它们对您没有用。
正在呼叫。 Cast<T>().ToList
将导致列表的额外副本,这可能会对性能产生不利影响。
更好的(IMHO)方法是只创建一个包装器类并即时进行转换。 您想要这样的东西:
class ListWrapper<T> : IList<T>
{
private IList m_wrapped;
//implement all the IList<T> methods ontop of m_wrapped, doing casts
//or throwing not supported exceptions where appropriate.
//You can implement 'GetEnumerator()' using iterators. See the docs for
//yield return for details
}
这样的好处是不会创建整个列表的另一个副本。
弗雷德里克是正确的。 但是Nhibernate也可以选择返回多个结果集。 例如:
IList multiResults = session.CreateMultiCriteria()
.Add(pageCriteria)
.Add(countCriteria)
.List();
在上述调用中,没有选择返回类型列表的选项。 因此,必须如上所述进行转换,如下所示:
IList<T> results = ((IList)multiResults[0]).Cast<T>().ToList();
IList counts = (IList)multiResults[1];
一种方法是使用Linq,例如list.OfType<T>()
或.Cast<T>()
Frederik是正确的,NHibernate已经做到了。
var data = query.List<MyType>();
这将导致您指定类型的IList。 在这种情况下, IList<MyType>
。
您无法实现NHibernate返回IList吗? ICriteria接口定义List<T>
方法...
在这种情况下,无需使用Linq(OfType()或.Cast)。 NHibernate实现就足够了。
您只需要使用:
var results= query.List<YourType>();
代替
var results= query.List<>();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.