2

我是 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));
        }...
4

4 回答 4

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...
}
于 2012-05-08T21:07:53.537 回答
0

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

string[] attributeIds = null;

然后,您可以在 foreach 循环中访问它,确保您只是分配给它并且不要尝试再次创建它

attributeIds = new string[domattributeIds.Length + intlattributeIds.Length];
于 2012-05-08T21:09:14.587 回答
0

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

这意味着您的domattributeIds,intlattributeIdsattributeIds变量仅在围绕它们的语句中是已知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);
}
于 2012-05-08T21:09:56.530 回答
0

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

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

foreach (string attributeId in attributeIds) {
    ....
}
于 2012-05-08T21:12:02.880 回答