我有一个变量包含:
有时是字符串数组,有时是数组字符串数组
e.g:
var words = a LINQ to XML query;
//words == { "01", "02", "03", ... }
//or
//words == { {"01", "02", "03"}, {"04", "05", "06"}, ... }
现在,我希望使用words
来访问for statement
数组中的每个项目
你能指导我吗?
感谢
答案 0 :(得分:3)
(注意:请参阅编辑...)
如果您事先并不知道自己是否有字符串数组或字符串数组数组,则需要有条件地调用SelectMany
:
string[][] multi = words as string[][];
string[] flattened = multi == null ? words : multi.SelectMany(x => x).ToArray();
请注意,在这种情况下,如果您更改 flattened
的内容,则会更改words
(如果已经是平的)或只是更改副本(如果这是一个锯齿状的阵列)。如果要使其一致,可以在条件运算符的第二个操作数中调用words.ToArray()
:
string[] flattened =
multi == null ? words.ToArray() : multi.SelectMany(x => x).ToArray();
你有没有办法避免开始时的歧义?特别是,如果您控制所涉及的LINQ to XML查询,您应该能够使它们提供一致的结果类型。
编辑:我刚刚意识到,如果您不知道要开始的数据类型,那么words
可能被宣布为object
或IEnumerable
。在这种情况下,你需要这样的东西:
public string[] Flatten(object words)
{
string[][] multi = words as string[][];
if (multi != null)
{
return multi.SelectMany(x => x).ToArray();
}
string[] single = words as string[];
if (single != null)
{
return single.ToArray(); // Defensive copy; remove if not needed
}
throw new ArgumentException("Argument must be string[] or string[][]");
}
这仍然非常狡猾 - 你绝对应该尝试让查询为你提供一些一致的结果类型。
答案 1 :(得分:2)
您可以使用SelectMany将第二个表单转换为第一个表单:
string[] words = words2.SelectMany(x => x).ToArray();