C# 包含多个列表集合<;T>;混合类型的对象?

C# 包含多个列表集合<;T>;混合类型的对象?,c#,linq,object,casting,C#,Linq,Object,Casting,给定不同类型的列表的数量可变,我提出了一种适合弗兰肯斯坦的方法(method2),将它们连接到一个类型为object的集合中 我是有点厚还是下面的代码或多或少是必要的 object[] foo() { var a = new List<string>() { "hello" };//type 1 var b = new List<Uri>() { new Uri("http://test") };//type 2 //combined I

给定不同类型的列表的数量可变,我提出了一种适合弗兰肯斯坦的方法(
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();
}
object[]foo()
{
var a=new List(){“hello”};//类型1
var b=new List(){new Uri(“http://test“”};//类型2
//合二为一
IEnumerable method2=newobject[]{a,b}.Select(x=>((IEnumerable)x.Cast()).SelectMany(y=>y);
var returnable=method2.ToArray();
bool success=(可返回[0]为字符串);
return-returnable.ToArray();
}
我知道将
列表
转换为
列表
是不可能的,因为它们是根本不同的类型,但我认为上面的方法有点极端。

列表
转换为
列表
非常简单

var yourList = new List<string>() {"hello");
List<object> a = yourList.ToList<object>();
var yourList=new List(){“hello”);
List a=yourList.ToList();
您可以对所有列表执行此操作,并使用
AddRange

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

var n=a.Cast().Concat(b.Cast()).ToArray();
object[]result=a.Cast().Concat(b.Cast()).ToArray();
列表
是可数的,这些是协变的。因此您可以使用:

var method2 = ((IEnumerable<object>)a).Concat((IEnumerable<object>)b);
var方法2=((IEnumerable)a).Concat((IEnumerable)b);

事实上,就这么简单:

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

由于这两个列表都实现了
IEnumerable
,也就是说,它们可以作为
第一个
第二个
参数传递,而无需强制转换。

您可以单独强制转换
a
b
,然后
联合
结果?或者返回一个
动态
对象数组?这不是真正的
 cast
ing。这种方法的问题是.ToList()创建原始数据的副本。存在不需要这样做的解决方案。这是迄今为止最好的答案。它调用与我的答案相同的方法,但以更可读的方式执行。
var method2 = ((IEnumerable<object>)a).Concat((IEnumerable<object>)b);
var result = a.Concat<object>(b);
IEnumerable<object> Concat(IEnumerable<object> first, IEnumerable<object> second)