我有一个变量,包含:
有时是字符串数组,有时是字符串数组的数组
例如:
var words = a LINQ to XML query;
//words == { "01", "02", "03", ... }
//or
//words == { {"01", "02", "03"}, {"04", "05", "06"}, ... }
现在,我想用一个 for语句
访问每个 words
数组中的项。
你能指导我怎么做吗?
谢谢
注意:请查看编辑...
如果您事先不知道您是否有一个字符串数组或字符串数组的数组,您需要有条件地调用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[][]");
}
这还是非常棘手的 - 你应该尽量让查询返回一些一致的结果类型。
string[]
和string[][]
上使用SelectMany
,并且在两种情况下都可以工作。 - Mike TwoIEnumerable<char>
,这并不是你想要的。 - Jon Skeetstring[] words = words2.SelectMany(x => x).ToArray();
ToArray()
,如果你想让它编译通过。否则,可以使用IEnumerable<string>
或者var
。请注意,翻译后的内容与原文意思相同,更加简洁易懂。 - Jon Skeet
words
变量的类型是什么? - Darin Dimitrov