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.

虽然这是一个坏主意,因为您已经使闯入系统变得更加容易。如果我尝试将我的密码设置为某个值,而你拒绝了,我现在知道你的一个用户使用了该密码。你最好让这种情况发生,尽管你可能应该通过质量检查来阻止一些更有可能的违规者(“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;

尝试这样的事情,也许您必须自定义您的退货声明,但它应该让您了解它是如何工作的。

于 2012-08-30T14:21:00.727 回答
2
foreach(var item in yourList)
{
   //Iterate;
}

如果你想要 break ,你可以使用 : break;

如果你想完成,你可以使用:继续;

于 2012-08-30T14:20:47.023 回答
2

List<T>实现IEnumerable<T>,所以你可以使用foreach,或者如果你能够T在循环中编辑,你可以使用for.

foreach(var item in custLoginHist)
{

}

或者

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

}

然后,如果您需要在循环完成之前退出循环(例如,如果您有一个条件为真,您可以使用break;退出循环,或者return如果您想返回一个值,您也可以从循环中退出。

于 2012-08-30T14:25:12.423 回答
1

您可以为此循环。例如foreachfor

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 回答