将多个列表集合与混合类型连接到对象

本文关键字:混合 类型 连接 对象 集合 列表 | 更新日期: 2023-09-27 18:31:24

给定不同类型的列表数量可变,我想出了一种值得弗兰肯斯坦的方法(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<object>进行List<string>,因为它们是根本不同的类型,但认为上述内容有点极端。

将多个列表<T>集合与混合类型连接到对象

实际上,它就是这样简单的:

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

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

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

由于这两个列表都实现了协变的IEnumerable<T>,因此它们可以作为first传递,并且无需强制转换即可second参数。

object[] result = a.Cast<object>().Concat(b.Cast<object>()).ToArray();

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

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

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

每个对象都继承自object因此此方法在此处有效 MSDN

List<T>IEnumerable<T>,的,它们是协变的。因此,您可以使用:

var method2 = ((IEnumerable<object>)a).Concat((IEnumerable<object>)b);
var n = a.Cast<object>().Concat(b.Cast<object>()).ToArray();