C#中将List<string[]>转换为List<object[]>的方法

12

大家好,我是否已经疯了(这不是问题)。我想将 List<string[]> 转换为 List<object[]>

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

这种方法目前无法工作,但是除非我忘记了什么,使用此方法进行转换应该是可行的(不需要使用Lambda表达式)?

谢谢你的时间。

4个回答

22

你想要使用类似于以下代码:

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

或者在 C# 4.0 中,只需

List<object[]> objParams = parameters.ToList<object[]>();
或者
List<object[]> objParams = parameters.ConvertAll(s => (object[])s);

4

由于数组协变,在.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>());

然后,您可以使用几乎任何类型的实例替换每个内部数组的元素。


谢谢你。然而,尽管我的初始提问已经输入,我首先尝试了上述代码中的第一段,但没有使用 var,为什么在这种情况下 var 起着至关重要的作用 - 我想答案是它正在为我执行强制转换 ToList()。真的很棒...感谢你的时间。 - MoonKnight
不需要使用 var,您可以使用 List<object[]> result = parameters.ToList<object[]>();,所以我不确定您原来的尝试出了什么问题。 - Ani

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();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接