[英]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.