鉴于可变数量的List具有不同类型,我已经提出了一种frankenstein值得的方法(method2
)将它们连接成一个object
类型的集合。
我是否有点厚或者下面的代码或多或少是必要的?
object[] foo()
{
var a = new List<string>() { "hello" };//type 1
var b = new List<Uri>() { new Uri("http://test") };//type 2
//combined
IEnumerable<object> method2 = new object[]{a, b}.Select(x=>((IEnumerable)x).Cast<object>()).SelectMany(y=>y);
var returnable = method2.ToArray();
bool success = (returnable[0] is string);
return returnable.ToArray();
}
我知道不可能将List<string>
转换为List<object>
,因为它们是根本不同的类型,但认为上述内容有点极端。
答案 0 :(得分:4)
实际上,它就像这样简单:
var result = a.Concat<object>(b);
通常,LINQ方法的类型参数被推断为它们被调用的最具体类型(在本例中为string
),但没有什么能阻止您指定基类型。以上内容使用此签名调用Enumerable.Concat:
IEnumerable<object> Concat(IEnumerable<object> first, IEnumerable<object> second)
由于两个列表都实现了IEnumerable<T>
covariant,因此可以将它们作为first
和second
参数传递而不进行转换。
答案 1 :(得分:2)
将List<string>
转换为List<object>
非常简单
var yourList = new List<string>() {"hello");
List<object> a = yourList.ToList<object>();
您可以对所有列表执行此操作,并使用AddRange
每个对象都继承自object
,因此这种方法有效MSDN here
答案 2 :(得分:2)
object[] result = a.Cast<object>().Concat(b.Cast<object>()).ToArray();
答案 3 :(得分:2)
List<T>
是IEnumerable<T>,
,这些是协变的。所以你可以使用:
var method2 = ((IEnumerable<object>)a).Concat((IEnumerable<object>)b);
答案 4 :(得分:0)
var n = a.Cast<object>().Concat(b.Cast<object>()).ToArray();