2012-06-22 80 views
7

所有,我心智(这不是问题)。我想List<string[]>转换为List<object[]>C#列表<string[]>至列表<object[]>转换

List<string[]> parameters = GetParameters(tmpConn, name); 
List<object[]> objParams = parameters.OfType<object[]>(); 

这是行不通的,但除非我已经忘了什么使用这种方法的转换应该是可能的(没有lambda表达式需要)?

谢谢你的时间。

+1

'... OfType ()' – 2012-06-22 18:54:08

回答

16

你想使用类似:

List<object[]> objParams = parameters.OfType<object[]>().ToList(); 

或C#4.0,只是

List<object[]> objParams = parameters.ToList<object[]>(); 

List<object[]> objParams = parameters.ConvertAll(s => (object[])s); 
+1

太傻了。谢谢你,花了很长的一个星期五... – MoonKnight

3

OfType<string[]>返回一个IEnumerable<string[]>,而不是List<object[]>

Enuemrable.OfType过滤掉任何无效的转换。您可能需要考虑Enumerable.Cast,如果您犯了错误,则会抛出。如果string[]没有继承object[](我真的不记得),那么您可能需要拨打Enumerable.Select来提供转换。

您肯定需要在那里的Enumerable.ToList调用。

0

如何做这种方式

List<string[]> sList = new List<string[]> {new []{"A", "B"}}; 
List<object[]> oList = sList.Cast<object[]>().ToList(); 
2

因为数组协变的,在.NET 4.0中,你可以这样做:

// Works because: 
// a) In .NET, a string[] is an object[] 
// b) In .NET 4.0, an IEnumerable<Derived> is an IEnumerable<Base>    
var result = parameters.ToList<object[]>(); 

但请注意,你不会是能够变异那些除了字符串以外的其他数组(因为数组协变并非真正安全)。

如果你想真正灵活的可写对象数组,你可以这样做:

var result = parameters.Select(array => array.ToArray<object>()) 
         .ToList(); 

(或)

var result = parameters.ConvertAll(array => array.ToArray<object>()); 

然后,你可以替换的情况下,每个内部数组的元素几乎任何请输入你的名字。

+0

谢谢你。然而,尽管我的原始类型的问题。上面的第一个是我尝试过的,但没有'var',为什么在这种情况下'var'造成了至关重要的区别 - 我想答案是它为我执行了'ToList()'强制转换。真奇怪......感谢你的时间。 ' – MoonKnight

+0

'var'不是必需的,你可以做'List result = parameters.ToList ();',所以我不确定你最初的尝试出错的地方。 – Ani

相关问题