将List <t>的多个集合与混合类型连接到对象?</t>

时间:2013-09-16 12:12:59

标签: c# linq object casting

鉴于可变数量的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>,因为它们是根本不同的类型,但认为上述内容有点极端。

5 个答案:

答案 0 :(得分:4)

实际上,它就像这样简单:

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

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

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

由于两个列表都实现了IEnumerable<T> covariant,因此可以将它们作为firstsecond参数传递而不进行转换。

答案 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();