0

SOを検索していくつかの投稿を見つけましたが、それらを機能させることができませんでした。

質問: リスト コレクション (custLoginHist[1] など) の次のアイテムにループするにはどうすればよいですか?

    List<eCommCustomer.oCustomer> custLoginHist = new List<eComm.oCustomer>();
    eCommCustomerDAL.GetCustomerPrevLogin(custLoginHist, oCust);

    if (custLoginHist.Count > 0)
    {
        eCommSecurityFactory oSecFactory = new eCommSecurityFactory();
        if (oCust.CustHash == oSecFactory.CreateHash(custLoginHist[0].CustSalt, custLoginHist[0].CustHash))
        {
            //Password has been used before;
            return false;
        }
        else
        {
            // Valid password;
            return true;
        }
    }
    return true;
}
4

6 に答える 6

5
foreach(eCommCustomer.oCustomer cust in custLoginHist)
{
  //Do something with cust here.
}

また:

for(int i = 0; i != custLoginHist.Count; ++i)
{
  eCommCustomer.oCustomer cust = custLoginHist[i];
  //Do something with cust here.
}

この場合、単一の一致に対して false を返し、それ以外の場合は true を返したいので、次のようにします。

foreach(eCommCustomer.oCustomer cust in custLoginHist)
  if(oCust.CustHash == oSecFactory.CreateHash(custLoginHist[0].CustSalt, custLoginHist[0].CustHash)
    return false;
return true;//if we reached here, no matches.

ただし、システムへの侵入を容易にしたため、これは悪い考えです。私が自分のパスワードを何かに設定しようとして、あなたが拒否した場合、あなたのユーザーの 1 人がそのパスワードを使用していることがわかります。このケースをそのままにしておく方がはるかに良いのですが、品質チェックを使用して、より可能性の高い攻撃者 (「password」、「password1」など) をブロックする必要があります。

于 2012-08-30T14:21:01.670 に答える
3
List<eCommCustomer.oCustomer> custLoginHist = new List<eComm.oCustomer>();
eCommCustomerDAL.GetCustomerPrevLogin(custLoginHist, oCust);

foreach (var custLogin in custLoginHist)
{
    eCommSecurityFactory oSecFactory = new eCommSecurityFactory();
    if (oCust.CustHash == oSecFactory.CreateHash(custLogin.CustSalt, custLogin.CustHash))
    {
        //Password has been used before;
        return false;
    }
}
return true;

このようなことを試してください。return ステートメントをカスタマイズする必要があるかもしれませんが、それがどのように機能するかについての洞察が得られるはずです。

于 2012-08-30T14:21:00.727 に答える
2

List<T>を実装IEnumerable<T>しているので、を使用するか、ループでforeach編集できる場合はを使用できます。 Tfor

foreach(var item in custLoginHist)
{

}

または

for (int i = 0; i < custLoginHist.Count; i++)
{

}

次に、ループが完了する前にループを終了する必要がある場合(たとえば、条件がtrueの場合はbreak;、ループを終了するために使用できreturnます。値を返したい場合は、ループを終了することもできます。

于 2012-08-30T14:25:12.423 に答える
2
foreach(var item in yourList)
{
   //Iterate;
}

break が必要な場合は、 : break; を使用できます。

終了したい場合は、次を使用できます。

于 2012-08-30T14:20:47.023 に答える
1

これをループできます。たとえば、foreachまたはfor:

foreach (var custLogin in custLoginHist)
{
    eCommSecurityFactory oSecFactory = new eCommSecurityFactory();
    if (oCust.CustHash == oSecFactory.CreateHash(custLogin.CustSalt, custLogin.CustHash))
    {
        //Password has been used before;
        return false;
    }
    else
    {
        // Valid password;
        return true;
    }
}
于 2012-08-30T14:20:44.243 に答える
1
List<eCommCustomer.oCustomer> custLoginHist = new List<eComm.oCustomer>();
eCommCustomerDAL.GetCustomerPrevLogin(custLoginHist, oCust);



return custLoginHist.Select(c=>oSecFactory.CreateHash(c.CustSalt,c.CustHash))
                    .Any(x=>x==oCust.CustHash)
于 2012-08-30T14:22:08.070 に答える