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)