将多个列表集合与混合类型连接到对象
本文关键字:混合 类型 连接 对象 集合 列表 | 更新日期: 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>
,因为它们是根本不同的类型,但认为上述内容有点极端。
实际上,它就是这样简单的:
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();