访问数组项?

时间:2010-03-10 07:19:57

标签: c# .net arrays string

我有一个变量包含:
有时是字符串数组,有时是数组字符串数组 e.g:

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

现在,我希望使用words来访问for statement数组中的每个项目 你能指导我吗? 感谢

2 个答案:

答案 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可能被宣布为objectIEnumerable。在这种情况下,你需要这样的东西:

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