2009-06-10 8 views
0

resultsが何かを見つけたら 「はい、何かが見つかりました」と表示された場合は処理する方法を見つけ出す必要があります。そうでない場合は「この時点でユーザーが見つかりませんでした」と表示されます。私はこれを理解しようとしましたが、私はそうすることができません。あなたの時間をありがとう。次のようにif文またはboolを使用しますか?

私のコードは次のとおりです。

DateTime dt = DateTime.Today; 
DateTime less5dt = dt.AddDays(-5); 
This.cmb1.Items.Clear(); 

PrincipalSearchResult results = 
UserPrincipal.FindByLockoutTime(
    adPrincipalContext, 
     dt, 
      MatchType.GreaterThanOrEquals); 

foreach (Principal result in results) 
{ 
    cmb1.Items.Add(result.name); 
} 
+1

ようなことをすればよいですか?それが0であれば、何も見つかりませんでした。そうでなければ.... –

答えて

7

あなたは結果の長さを確認することができます。もしゼロより大きければ、別のことをします。

+0

私は同意します。 if文の長さを使用します。 –

+2

MSDNの記事が正確であると仮定すると、Lengthプロパティは公開されていません。しかしCountプロパティは同じように動作するはずです。http://msdn.microsoft.com/en-us/library/bb292002.aspx – senfo

0

クラスにcount/lengthメンバーを追加できます。

-1
if (!results.OfType<Principal>().Any()) 
{ 
    //code when nothing is found, here 
} 

あなたのコレクションがIEnumerable<Principal>を実装している場合、私は知らないので、私はOfTypeを使用し、私はそれがIEnumerableを実装して賭けます。

すでにCountプロパティがある場合は、もちろんそれを確認するのが「高速」です。測定が速い?うーん。そして、あなたはそのCountプロパティを最新の状態に保つためにお金を払っています。

+0

results.Count == 0をチェックするのではなく、このようにするのに利点はありますか?結果は、文書によってプリンシパル以外のタイプのオブジェクトは決して含まれてはならず、OPコードはそれとは別の方法では動作しません。私は結果を考えています。 –

+0

利点はありません(Any()は若干遅くなることがあります)。 – mquander

-2

とにかく結果をループしているので、上にブール値を導入することは全くありません。

bool hasResults = false; 
foreach (Principal result in results) 
{ 
    hasResults = true; 
    cmb1.Items.Add(result.name); 
} 
if (hasResults) 
{ 
    return "yes, something was found"; 
} 
else 
{ 
    return "no users have been found at this time"; 
} 

このコードは短縮できますが、読みやすくする必要があります。

あなたは(私はあなたがあなたが投稿したコードに基づいて必要性を行うことを理解)ループする必要はありません場合、あなたは可能性短絡結果とブール値を除外する:

foreach (Principal result in results) 
{ 
    return "yes, something was found"; 
} 
return "no users have been found at this time"; 

第2の解決策は、列挙可能なクラスのCountプロパティにアクセスできない場合に適しています。この場合、あなたがこのようなアクセス権を持っているような他の答えから見えますが、私はこの例を仮説として残しています。

+0

まあまあです。最初の例では、ループの各繰り返しを真に割り当てます。最初にCountプロパティの値を評価するほうがはるかに優れています。 2番目の例は理にかなっていません。コンボボックスにresult.Nameを追加する機能が壊れました。これは一度だけ実行されるという事実はもちろんですが、なぜそれがループ内にあるのでしょうか?最後に、このメソッドは必ずしも文字列、ピリオドを返すわけではありません。 – senfo

+1

@senfo、私はフィードバックを感謝します。少なくとも私は下降音を説明する何かをつかまえました。ここに私の考えがあります:2番目の例では、私は "あなたがループを必要としないかどうか"を明確に述べました。これは仮説であり、Countが利用できないという仮定に基づいています。 IEnumeratorだけを返すものを呼び出すときは、この特定のソリューションを使用します。私はPrincipalReturnResultがcountプロパティを持っているという他の答えに基づいています...私はそれが編集に値するとは思っていませんでした。 –

+0

最初のシナリオの批判に答えるために、メソッドのシグネチャは定義されていません。文字列を返すこともあります。そうでなければ、それをに変更することができます。 OPは決してメッセージがどのように処理されたかを決して定義しなかった...私はただ推測した。第2に、ローカルスコープのブール値にtrueの値を割り当てることは、ほとんど何も費やさない。既存の値をチェックするかブール値に対してビット単位の演算を行うと、どちらもコストがかかります。実際、Countへの呼び出しでは、割り当て操作よりもコストがかかる可能性があります(反復回数によって異なります)。 –

4

PrincipalSearchResult classのMSDN資料が正しい場合、Countプロパティが公開されています。


if (results.Count > 0) 
{ 
    foreach (Principal result in results) 
    { 
     cmb1.Items.Add(result.name); 
    } 
} 
else 
{ 
    // Hide contorls and/or show message 
}
1

あなたはちょうどCMB1に関連付けられているアイテムの数を取得できません。この

DateTime dt = DateTime.Today; 
DateTime less5dt = dt.AddDays(-5); 

PrincipalSearchResult results = UserPrincipal.FindByLockoutTime(
    adPrincipalContext, 
    dt, 
    MatchType.GreaterThanOrEquals); 

if (results.Count > 0) 
{ 
    This.cmb1.Items.Clear(); 
    foreach (Principal result in results) 
    { 
     cmb1.Items.Add(result.name); 
    } 
} 
else 
{ 
    //Considering you have a label called lblMessage 
    lblMessage.Text = "no users have been found at this time" 
    cmb1.Visible = false; 
} 
関連する問題