4

私は最初に次のコードを持っていました:

        Boolean successCheckPoint = false;
        Boolean failureCheckPoint = false;
        Boolean timeFound = false;

        foreach (var row in auditRows)
        {
            timeFound = row.Text.Contains(sCurrentTime) || row.Text.Contains(sLenientTime) || row.Text.Contains(sLenientTime2) ? true : false;

            if (timeFound)
            {
                successCheckPoint = row.Text.Contains("Web User Login Success") && !successCheckPoint ? true : false;
                failureCheckPoint = row.Text.Contains("Web User Login Failure") && !failureCheckPoint ? true : false;
            }                                

        }

しかし、foreachのその後の反復では、successCheckPointまたはfailureCheckPointブール値がtrueに設定されていても、割り当ての設定方法が原因でfalseに設定されることになります。


問題の例

最初の反復

  1. timeFoundはtrueです
  2. successCheckPointはfalseです
  3. row.Textには必要なテキストが含まれています
  4. successCheckPointは確かにfalseです
  5. successCheckPointをtrueに設定

2回目の反復

  1. timeFoundはtrueです
  2. successCheckPointはtrueです
  3. row.Textに必要なテキストが含まれていません
  4. successCheckPointはfalseではありません
  5. successCheckPointをfalseに設定

そこで、問題を解決するために、コードを次のように変更しました。

        Boolean successCheckPoint = false;
        Boolean failureCheckPoint = false;
        Boolean timeFound = false;

        foreach (var row in auditRows)
        {
            timeFound = row.Text.Contains(sCurrentTime) || row.Text.Contains(sLenientTime) || row.Text.Contains(sLenientTime2) ? true : false;

            if (timeFound)
            {
                if (!successCheckPoint)
                {
                    successCheckPoint = row.Text.Contains("Web User Login Success") ? true : false;
                }

                if (!failureCheckPoint)
                {
                    failureCheckPoint = row.Text.Contains("Web User Login Failure") ? true : false;
                }
            }                                

        }

これは私が望んでいることを実行しますが、このタイプの動作を実現するためのより良い方法があるはずだと感じています。ブール値がtrueに設定されると、将来の反復でfalseに戻らないように設定する方法はありますか?


正しい動作

最初の反復

  1. timeFoundはtrueです
  2. successCheckPointはfalseです
  3. row.Textには必要なテキストが含まれています
  4. successCheckPointは確かにfalseです
  5. successCheckPointをtrueに設定

2回目の反復

  1. timeFoundはtrueです
  2. successCheckPointはtrueなので、再評価をスキップします

それでも混乱する場合は申し訳ありません。必要に応じてもう少し説明できます。


編集:今私はそれについて考えるので、私は本当に'を必要としませんか?true:false'このコードの部分。

新しいコード:

        Boolean successCheckPoint = false;
        Boolean failureCheckPoint = false;
        Boolean timeFound = false;

        foreach (var row in auditRows)
        {
            timeFound = row.Text.Contains(sCurrentTime) || row.Text.Contains(sLenientTime) || row.Text.Contains(sLenientTime2);

            if (timeFound)
            {
                if (!successCheckPoint)
                {
                    successCheckPoint = row.Text.Contains("Web User Login Success");
                }

                if (!failureCheckPoint)
                {
                    failureCheckPoint = row.Text.Contains("Web User Login Failure");
                }
            }                                

        }

みんな助けてくれてありがとう!これが私が決めたコードのバージョンです:

        Boolean successCheckPoint = false;
        Boolean failureCheckPoint = false;
        Boolean timeFound = false;

        foreach (var row in auditRows)
        {                            
            if (row.Text.Contains(sCurrentTime) || row.Text.Contains(sLenientTime) || row.Text.Contains(sLenientTime2))
            {
                successCheckPoint |= row.Text.Contains("Web User Login Success");
                failureCheckPoint |= row.Text.Contains("Web User Login Failure");
            }

            if (successCheckPoint && failureCheckPoint)
            {
                break;
            }

        }
4

3 に答える 3

8

OR代入演算子|=を使用できます:

bool successCheckPoint = false;
bool failureCheckPoint = false;

foreach (var row in auditRows)
{
    if (row.Text.Contains(sCurrentTime) ||
        row.Text.Contains(sLenientTime) ||
        row.Text.Contains(sLenientTime2))
    {
        successCheckPoint |= row.Text.Contains("Web User Login Success");
        failureCheckPoint |= row.Text.Contains("Web User Login Failure");
    }                                
}

a |= b;の略ですa = a | b;。したがって、aすでに真である場合、それは真のままです。aがfalseでbtrueの場合、trueになりaます。それ以外の場合は、afalseのままです。

于 2012-06-27T19:34:06.790 に答える
6

次のように、OR演算子を使用するだけです。

bool failed = false;

failed |= CheckOne();
failed |= CheckTwo();
于 2012-06-27T19:33:56.810 に答える
1

他の回答はこのコードを複雑にしすぎているので、私はあまり好きではありません。linqは、コードを読みやすくするのに役立つと思います。

var rows = auditRows.Where(TimeIsFound);
var successCheckPoint = rows.Any(RowContainsSuccess);
var failureCheckPoint = rows.Any(RowContainsFailure);

...elsewhere...

static bool TimeIsFound(SomeType row)
{
    return row.Text.Contains(sCurrentTime) ||
           row.Text.Contains(sLenientTime) ||
           row.Text.Contains(sLenientTime2);
}
static bool RowContainsSuccess(SomeType row)
{
    return row.Text.Contains("Web User Login Success");
}
static bool RowContainsFailure(SomeType row)
{
    return row.Text.Contains("Web User Login Failure");
}

これにより、コードがわかりやすくなると思います。ほとんど段落になります。

特定の時間が見つかった行を取得します。successCheckPointいずれかの行に成功メッセージが含まれている場合はtrueです。failureCheckPointいずれかの行に失敗メッセージが含まれている場合はtrueです。

読みやすくすることで、後でデバッグしやすくなります。さらに、これにより機能が一口サイズのチャンクに分割されます。

複数回ループすることを心配する必要はありません。100アイテムを1回ループして3つのアクションを実行すると、100アイテムを3回ループして毎回1アクションを実行するのとほぼ同じ時間がかかります(1 * 100 * 3 == 3 * 100 * 1、図を参照)

于 2012-06-27T19:49:24.587 に答える