2011-01-05 9 views
1

を動作しません。これは、 'plans'という文字列配列が正しい属性を取得してもforeach内で最初の要素のみを繰り返し処理するため、配列変数の最初のものとは異なる他の要素と一致する場合はtrueを返しません...あなたは問題がのforeach cicleに権利があると言うことができるが、私はそれを参照してくださいカント...私は百倍のようにこれをやったと私は私が間違っているの何...ありがとう理解することはできません、単純な文字列配列反復は、これは、セッション変数を持つ文字列配列の各要素を比較した後、trueまたはfalseを返す必要があり、単純なコードである

私は

EDIT ...あなたはのstring.Split経由で値を追加する前に、文字列配列「計画」の長さを設定する明示的にする必要があります信じて

protected bool ValidatePlans() 
{ 
    bool authorized = false; 

    if (RequiredPlans.Length > 0) 
    { 
     string[] plans = RequiredPlans.Split(','); 
     foreach (string plan in plans) 
     { 
      if (MySessionInfo.Plan == plan) 
       authorized = true; 
     } 
    } 
    return authorized; 
} 
+1

この質問を言い換えてください。それをあなた自身に読んでください。たぶん私は大嫌いですが、私は本当にあなたが何を求めているのか理解していません。 – driis

+5

私はあなたの分析が正しいとは思わない。デバッガの下でこれを実行し、コードをステップ実行しましたか?さらに、あなたの質問に対する答えを受け入れるべきです。 –

+0

'RequiredPlans'にあるかもしれないテキストの例を提供できますか? – Jay

答えて

0

私は私はあなたの問題を理解100%わからないんだけど、あなたのような文字列を使用している場合、私は疑問に思います:

"Blue, Green" 

...とMySessionInfo.Plan"Green"(スペースなし)であるときtrueを戻すには、このメソッドを期待。 これが問題の場合は、Split結果に余分なスペースがあるという単純な問題です。

if (MySessionInfo.Plan == plan) 

...これに:これは、これを変更することにより、固定することができ

if (MySessionInfo.Plan == plan.Trim()) 

それはそれではない場合は、多分私はあなたの問題を誤解しました。

編集your comment to HABJAN's answerから、私は聞いている:コードあなたが掲載されて正確にあなたがを使用している実際のコードと同じ?もし私が頭を傷つけなければならないのは、彼が提案した修正がどのように提案されたのか(その方法がより効率的になるので、良い方法だが)はあなたの問題を解決できたはずである。

+0

Mmm ...それは、私を試してみるかもしれない! –

+0

それで、ここでそれはどのように働いたのです!私はHabjanの修正と、Trimの使用についてのあなたのアイデアを使用しました...そのようにして、最終的にはうまくいきました...ループを修正する方法も理解できませんでした。 –

+0

ダンの違いは、メソッドが返された時点で一致したことです。その前に彼はちょうど '許可された'ブール値を設定していて、真ん中に一致があったとしても、最後のアイテムは常に偽を返すと確信しています。だから、一度マッチが行われると、HABJANの答えは本質的にループを固定する方法から戻ってきました。 –

0

:いいえ、私は間違っていた...あなたの方法配列を取り込むのはうまくいくはずです。あなたは自分自身をArray.IndexOf()を使用しての代わりに、すべての作業を行うことを検討することをお勧めします私の答え

+0

申し訳ありませんが、投稿後に間違っていたことに気付きました。 – stephen776

+0

動的なので、私はそれを明示的に設定できません。もう一つの解決策かもしれない?必要なサンプルのサンプル: –

+0

"Blue"、 "Blue、Orange"、 "Blue、Orange、Green" ...常に青色のままです... –

1

を無視:

protected bool ValidatePlans() 
{ 
    return (RequiredPlans.Length > 0 
     && Array.IndexOf(RequiredPlans.Split(','), MySessionInfo.Plan) >= 0); 
} 
0
protected bool ValidatePlans() 
{ 
    if (RequiredPlans.Length > 0) 
    { 
     string[] plans = RequiredPlans.Split(','); 
     foreach (string plan in plans) 
     { 
      if (MySessionInfo.Plan == plan) 
       return true; 
     } 
    } 

    return false; 
} 
+0

habjan、これは実際にループを修正しますか?もしそうなら、どうですか?それ以外の場合は、あなたが認可されたブールを削除したように見えますが、その質問には答えませんでした。 – Dlongnecker

+0

これは奇妙なことですが、実際にはループを修正しましたが、私は理解できません。なぜなら、Planが計画を満たしてもそれが真実を返すことはないからです...他の人が提案し、Equalを使用しました。これはとても奇妙です=( –

0

いくつかの可能性:MySessionInfo.Planを想定し

A.が強く型付けされていません文字列として試してみてください。

if(MySessionInfo.Plan.Equals(plan)) { authorized = true; 休憩。 }

B.末尾にスペースがないことを確認し、比較の際に、.splitを行った後。あなたはMySessionInfo.Plan.Equals(plan.Trim())

C.手段「それは最初の要素だけ、の繰り返し処理を続けてforeachの」わからないを行うことができます。ループが配列内の他の要素を通過しないことは確かですか?

+0

あなたの答えはありがとうございました。 –

1

あなたのコードは、私には罰金に見えますが、あなたが全体を置き換えることができます:

return RequiredPlans.Length > 0 && RequiredPlans.Split(',').Any(s => MySessionInfo.Plan == s); 
+0

+1、すてきなショートカットです(ちなみに、私の最初の回答には表示されませんでした)。 –

+0

ああ、いいアイデアです...ありがとうございました! –

0

これはあなたの入力は次のように探しているものであればRequiredPlansが、私は問題はあなたがを反復処理しているということはないと思う、 =「青、緑」のような文字列

あり、確かに最初の値は複数回になりますが、値をトリミングしていないことを確認してください。したがって、最初の後のすべてに先頭のスペースがあり、一致が失敗します。

はすなわち、それはブルー、ブルー、ブルーを返していないことを確認してください、RequiredPlansが真にユニークな文字列のアイテムを持っていることを確認してください

if (MySessionInfo.Plan == plan.Trim()) 
+0

はい、それは私のコードに関する間違ったことの一つでした!ありがとうございました! –

+0

クールな男、あなたはそれをまっすぐに持ってうれしい。これにより、デバッガが利用できるすべての情報を理解していない可能性があるという大きな問題があると私は信じています。たとえば、そのループをステップ実行するときには、現在の値を表示するために「プラン」変数にカーソルを移動するか、クイックウォッチに追加するか、ローカルペインで表示します。 (あなたはすでにこれすべてを知っているかもしれませんが、私が助けてくれるようにそれを投げ捨てると思っていました) – heisenberg

0

を試してみてください。

他にも言及したように、.Trim()には大文字と小文字の区別がないことを確認するために.ToLower()をスローしないでください。

その中にあるものがすべて明確に機能している必要があります。それが個々のテストとして機能することを確認するために、一時的なRequiredPlans文字列を作成しない場合。

protected bool ValidatePlans() 
{ 
    if (RequiredPlans.Length > 0) 
    { 
     string[] plans = RequiredPlans.Split(','); 
     foreach (string plan in plans) 
     { 
      if (MySessionInfo.Plan.Trim().ToLower() == plan.Trim().ToLower()) 
       return true; 
     } 
    } 

    return false; 
} 
関連する問題