0

给定可变数量的不同类型的列表,我想出了一个值得科学人的方法(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();
}

我知道不可能将 aList<string>转换为 aList<object>因为它们是根本不同的类型,但认为上述内容有点极端。

4

5 回答 5

4

其实,就这么简单:

var result = a.Concat<object>(b);

通常,LINQ 方法的类型参数被推断为调用它们的最具体的类型(在本例中为string),但没有什么能阻止您指定基类型。上面使用此签名调用Enumerable.Concat :

IEnumerable<object> Concat(IEnumerable<object> first, IEnumerable<object> second)

由于两个列表都实现IEnumerable<T>covariant,因此它们可以作为firstandsecond参数传递而无需强制转换。

于 2013-09-16T12:48:34.527 回答
2
object[] result = a.Cast<object>().Concat(b.Cast<object>()).ToArray();
于 2013-09-16T12:19:57.643 回答
2

List<T>IEnumerable<T>,并且这些是协变的。所以你可以使用:

var method2 = ((IEnumerable<object>)a).Concat((IEnumerable<object>)b);
于 2013-09-16T12:20:09.693 回答
2

转换List<string>List<object>非常简单

var yourList = new List<string>() {"hello");
List<object> a = yourList.ToList<object>();

您可以对所有列表执行此操作并使用AddRange

每个对象都继承自,object因此这种方法在此处是有效的MSDN

于 2013-09-16T12:15:53.707 回答
0
var n = a.Cast<object>().Concat(b.Cast<object>()).ToArray();
于 2013-09-16T12:17:16.013 回答