如何将非通用IList转换为IList <t>?</t>

时间:2009-04-22 09:41:01

标签: c#

我的课程需要IList<T>,但我有一个Systems.Collection.IList来自NHibernate jre。

我想创建一个将其转换为IList<T>的方法。我该怎么做?

7 个答案:

答案 0 :(得分:75)

如果您确定所有元素都继承自T(或您正在使用的任何类型)

IList<T> myList = nonGenericList.Cast<T>().ToList();

如果你不确定:

IList<T> myList = nonGenericList.OfType<T>().ToList();

当然,您需要System.Linq命名空间:

using System.Linq;

答案 1 :(得分:6)

CastOfType返回IEnumerable<T>个实现,而不是IList<T>实现,因此它们对您没用。

调用。Cast<T>().ToList将导致列表的额外副本,这可能会对性能产生负面影响。

更好的(恕我直言)方法是创建一个包装类并在运行中进行转换。你想要这样的东西:

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
}

这样做的好处是不会创建整个列表的另一个副本。

答案 2 :(得分:3)

一种方法是使用Linq,例如list.OfType<T>().Cast<T>()

答案 3 :(得分:3)

弗雷德里克是对的。但是Nhibernate也有一个返回多个结果集的选项。 例如:

  IList multiResults = session.CreateMultiCriteria()
                .Add(pageCriteria)
                .Add(countCriteria)
                .List();

在上面的调用中,没有返回类型列表的选项。所以它必须如上所述进行投射,如下所示:

 IList<T> results = ((IList)multiResults[0]).Cast<T>().ToList();
            IList counts = (IList)multiResults[1];

答案 4 :(得分:1)

难道你不能实现NHibernate给你一个IList吗? ICriteria接口定义了List<T>方法......

答案 5 :(得分:1)

弗雷德里克是对的,NHibernate已经做到了。

var data = query.List<MyType>();

这将导致您指定类型的IList。在这种情况下IList<MyType>

答案 6 :(得分:0)

在这种情况下,无需使用Linq(OfType()或.Cast)。 NHibernate实现就足够了。

您只需要使用:

#include <iostream>
#include <fstream>
#include <list>
using namespace std;

ifstream f("data.in");

int main()
{
    int n, v[100];
    f >> n;
    for (int i = 0; i < n; i++)
        f >> v[i];
    list<int> aux;
    aux.push_back(v[0]);
    list<list<int> > rows;
    rows.push_back(aux);
    for (int i = 1; i < n; i++)
    {
        int selected = 0;
        for (list<list<int> >::iterator it = rows.begin(); it != rows.end(); it++)
        {
            if (it->back() > v[i])
            {
                it->push_back(v[i]);
                selected = 1;
                break;
            }
        }
        if (!selected)
        {
            list<int> aux;
            aux.push_back(v[i]);
            rows.push_back(aux);
        }

    }
    for (list<list<int> >::iterator it = rows.begin(); it != rows.end(); it++)
    {
        for (list<int>:: iterator it2 = it->begin(); it2 != it->end(); it2++)
            cout << *it2 << " ";
        cout << endl;
    }

    int c = 1;
    if (c == 1)
    {
        int s[100];
        for (int i = 0; i < n; i++)
        {
            list<list<int> >::iterator it = rows.begin();
            int minim = it->back();
            it++;
            while (it != rows.end())
            {
                if (!it->empty())
                    if (it->back() < minim)
                        minim = it->back();
                it++;
            }
            it = rows.begin();
            while (it != rows.end())
            {
                    if (it->back() == minim)
                    {
                        it->pop_back();
                        if (it->empty())
                            rows.erase(it);
                        break;
                    }
                it++;
            }
            s[i] = minim;
        }
        for (int i = 0; i < n; i++)
            cout << s[i] << " ";

    }

}

代替

var results= query.List<YourType>();