如何访问数组项?

3

我有一个变量,包含:
有时是字符串数组,有时是字符串数组的数组
例如:

var words = a LINQ to XML query;
//words == { "01", "02", "03", ... }
//or
//words == { {"01", "02", "03"}, {"04", "05", "06"}, ... }

现在,我想用一个 for语句 访问每个 words 数组中的项。
你能指导我怎么做吗?
谢谢


2
words 变量的类型是什么? - Darin Dimitrov
正如我在帖子中提到的那样,它是一个数组。 - Mohammad Dayyan
2个回答

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
@Jon - 我不确定歧义是否是一个问题。我尝试了在string[]string[][]上使用SelectMany,并且在两种情况下都可以工作。 - Mike Two
3
对于一个 string[],使用 SelectMany 会给出一个 IEnumerable<char>,这并不是你想要的。 - Jon Skeet
你说得对。我在测试中只使用了单个字符的字符串,看起来很好。这是一个坏主意。 - Mike Two

2
您可以使用SelectMany将第二个表单转换为第一个表单:
string[] words = words2.SelectMany(x => x).ToArray();

3
当然,在末尾调用ToArray(),如果你想让它编译通过。否则,可以使用IEnumerable<string>或者var。请注意,翻译后的内容与原文意思相同,更加简洁易懂。 - Jon Skeet

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