我的课程需要IList<T>
,但我有一个Systems.Collection.IList
来自NHibernate jre。
我想创建一个将其转换为IList<T>
的方法。我该怎么做?
答案 0 :(得分:75)
如果您确定所有元素都继承自T(或您正在使用的任何类型)
IList<T> myList = nonGenericList.Cast<T>().ToList();
如果你不确定:
IList<T> myList = nonGenericList.OfType<T>().ToList();
当然,您需要System.Linq命名空间:
using System.Linq;
答案 1 :(得分:6)
Cast
和OfType
返回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)
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>();