9

所有,我有没有精神(这不是问题)。我想转换List<string[]>List<object[]>

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

这不起作用,但除非我忘记了一些东西,否则应该可以使用这种方法进行转换(不需要 Lambdas)?

谢谢你的时间。

4

4 回答 4

19

你想使用类似的东西:

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

或在 C# 4.0 中,只需

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

或者

List<object[]> objParams = parameters.ConvertAll(s => (object[])s);
于 2012-06-22T18:51:38.020 回答
3

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

Enuemrable.OfType过滤掉任何无效的演员表。您可能要考虑Enumerable.Cast改为,如果您犯了错误会抛出。如果string[]不继承自object[](我真的不记得了),您可能需要调用Enumerable.Select以提供转换。

您肯定需要在某处进行 Enumerable.ToList 调用。

于 2012-06-22T18:55:28.377 回答
3

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

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

于 2012-06-22T18:58:18.430 回答
0

这样做怎么样

List<string[]> sList = new List<string[]> {new []{"A", "B"}};
List<object[]> oList = sList.Cast<object[]>().ToList();
于 2012-06-22T18:57:48.867 回答