从一个范围的水平下C#改性字符串数组(C# modifying string array from

2019-09-17 03:02发布

我在C#中的新手,但我知道我应该能想出解决办法。 我的搜索技巧没有任何给我一个直接的答案。

我有存储在字符串数组(它们已经从分割,分隔的列表)两个应用设置。

最后,我想运行的代码一个大块,在这两种环境条件。

条件是:

  1. 如果在阵列1(domattributes)存在设置,在各设定值的代码。
  2. 如果设置也在阵列2(intlattributes)存在,运行在包含任一阵列1或阵列中的每个设定值的代码
  3. 下面就是我试图做它用if / else语句打造出来的字符串数组,但它不工作。

我得到的错误

名称“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));
        }...

Answer 1:

需要声明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...
}


Answer 2:

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

string[] attributeIds = null;

然后,您可以访问它在foreach循环中,请确保您只分配给它,不要试图重新创建

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


Answer 3:

无论何时一对大括号内声明变量( {}它是在该范围-它不是在其外部已知的。

这意味着你的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);
}


Answer 4:

您在声明里面的if语句(并重新else语句)attributeIds。 为了访问的if / else范围以外的变量,声明它的父范围:

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

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


文章来源: C# modifying string array from one scope level down