C#从一个作用域级别修改字符串数组

时间:2012-05-08 21:04:55

标签: c# arrays if-statement scope

我是C#的新手,但我知道我应该能够解决这个问题。我的搜索技巧也没有给我一个直接的答案。

我有两个存储在字符串数组中的应用程序设置(它们已从一个单独的列表中拆分)。

最终,我希望以两种设置为基础运行一大块代码。

条件是:

  1. 如果数组1(domattributes)中存在设置,请在每个设置值上运行代码。
  2. 如果数组2(intlattributes)中也存在设置,则对数组1或数组中包含的每个设置值运行代码
  3. 下面是我尝试使用if / else语句构建字符串数组的方法,但它不起作用。
  4. 我收到错误

      

    当前上下文中不存在名称'attributeIds'

    我假设这是因为字符串数组实际上是在if / else语句中构建的,并且可能与尝试使用它的foreach方法的范围不同。任何帮助,将不胜感激。这是代码:

    if (!string.IsNullOrEmpty(DomAttributesSetting))
    {
        if (!string.IsNullOrEmpty(IntlAttributesSetting))
        {
            string[] domattributeIds = DomAttributesSetting.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
            string[] intlattributeIds = IntlAttributesSetting.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
            string[] attributeIds = new string[domattributeIds.Length + intlattributeIds.Length];
            Array.Copy(domattributeIds, attributeIds, domattributeIds.Length);
            Array.Copy(intlattributeIds, 0, attributeIds, domattributeIds.Length, intlattributeIds.Length);
        }
        else
        {
            string[] attributeIds = DomAttributesSetting.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
        }
        foreach (string attributeId in attributeIds)
        {
            PersonAttribute personAttribute = (PersonAttribute)person.Attributes.FindByID(int.Parse(attributeId));
            if (personAttribute == null)
            {
                personAttribute = new PersonAttribute(person.PersonID, int.Parse(attributeId));
            }...
    

4 个答案:

答案 0 :(得分:6)

您只需要声明attributeIds 一次,并且必须在if语句之外声明它,以便它对方法的其余部分可见。

试试这个:

string[] attributeIds;
if (!string.IsNullOrEmpty(IntlAttributesSetting))
{
    string[] domattributeIds = DomAttributesSetting.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
    string[] intlattributeIds = IntlAttributesSetting.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
    attributeIds = new string[domattributeIds.Length + intlattributeIds.Length];
    Array.Copy(domattributeIds, attributeIds, domattributeIds.Length);
    Array.Copy(intlattributeIds, 0, attributeIds, domattributeIds.Length, intlattributeIds.Length);
}
else
{
    attributeIds = DomAttributesSetting.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
}

foreach (string attributeId in attributeIds)
{
    // etc...
}

答案 1 :(得分:0)

如果attributeIds不在您的范围内,您可以将它放在您的范围内。在你的if / else之前,把这个

string[] attributeIds = null;

然后,你可以在foreach循环中访问它,确保你只是分配给它而不是再尝试创建它

attributeIds = new string[domattributeIds.Length + intlattributeIds.Length];

答案 2 :(得分:0)

每当你在一对大括号({})中声明一个变量时,它就在那个范围内 - 它在它之外是不可知的。

这意味着您的domattributeIdsintlattributeIdsattributeIds变量仅在围绕它们的if语句中已知(并且您正在创建attributeIds范围内的第二个 else变量。您需要在该范围之外声明它们,以便在这些范围之外使用它们:

string[] attributeIds;

if (!string.IsNullOrEmpty(IntlAttributesSetting))
{
    ...
    attributeIds = new string[domattributeIds.Length + intlattributeIds.Length];
    ...
    Array.Copy(intlattributeIds, 0, attributeIds, domattributeIds.Length, intlattributeIds.Length);
}
else
{
    attributeIds = DomAttributesSetting.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
}

答案 3 :(得分:0)

您在if语句中声明了attributeIds(并在else语句中再次声明)。要在if / else作用域之外访问该变量,请在父作用域中声明它:

string[] attributeIds = null;
if (condition1) {
    attributeIds = ...
} else {
    attributeIds = ...
}

foreach (string attributeId in attributeIds) {
    ....
}