簡體   English   中英

如何將非通用IList轉換為IList <T> ?

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

CastOfType返回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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM