2012-05-08 7 views
2

私はC#の初心者ですが、これを理解できるはずです。私の検索スキルは、私に直接答えを与えていない。C#で1つのスコープレベルから文字列配列を変更する

文字列配列に格納されている2つのアプリケーション設定があります(分割されたリストから分割されています)。

最終的に、両方の設定に条件付きのコードを1つずつ実行したいとします。

条件は

  1. 設定がアレイ1(domattributes)に存在する場合、それぞれの設定値にコードを実行します。
  2. 設定が配列2(intlattributes)にも存在する場合は、配列1または配列に含まれる各設定値でコードを実行してください。
  3. 以下は、if/elseステートメントを使用して文字列配列は動作しません。私は文字列の配列が実際にあれば/に内蔵されているので、それがあると仮定していますエラー

    名「attributeIds」は現在のコンテキストで

    存在しません取得

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)); 
     }... 
+0

編集、Obedのおかげで。あなたは私にそれを打つ:) – gmaness

答えて

6

あなたがattributeIds一度だけを宣言する必要があり、それは方法の残りの部分に表示されるように、それはif文の外で宣言しなければなりません。 attributeIdsがあなたの範囲内にない場合、あなたは自分のスコープでそれを置くことができる

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... 
} 
+0

ああ私のおしゃれな、大丈夫、新聞のサインはどこですか?私は恥ずべきで着るだろう:(私はあなたが初期化なしで文字列配列を宣言することができたと気付かなかった、単に値を割り当てます。 – gmaness

0

はこれを試してみてください。あなたの/他の場合、この

string[] attributeIds = null; 

を置く前に、あなたは、foreachループでそれにアクセスするあなたはそれに割り当てることを確認して、もう一度

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

たびにそれを作成しようとしていないことができます中括弧({})の中に変数を宣言すると、それはそのスコープ内にあります - それはその外側には分かりません。

これはあなたのdomattributeIdsintlattributeIdsattributeIds変数は唯一、それらを取り巻くif文が知られている(そして、あなたがelse範囲内attributeIds第二の変数を作成している)ことを意味します。あなたはこれらのスコープ外でそれらを使用するために、その範囲の外でそれらを宣言する必要があります:あなたは(elseステートメントに再度)if文の内側attributeIdsを宣言している

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); 
} 
0

。if/elseスコープ外の変数にアクセスするには、親スコープで宣言します。

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

foreach (string attributeId in attributeIds) { 
    .... 
} 
関連する問題