我需要找到通过某个测试的对象,以及在通过第一个测试的所有对象中,另一个测试中值最低的对象。比方说,我必须从一组样本中找到俄罗斯方块得分最低的瑞典女性(假设每个人都玩过俄罗斯方块(当然他们玩过))。
很明显,我正在做一个for循环,并进行测试,将俄罗斯方块的分数与迄今为止的最低分数进行比较。但是,与第一个相比,分数应该是多少呢?
通常情况下,我也可以只参加第一次测试,然后将所有内容与那次进行比较,但他们也必须通过第一次测试。我也可以取一个任意大的数字,但这是错误的。
我也可以做两个循环,在第一轮收集所有瑞典女性,然后在第二轮收集分数,但有没有更短、更简单的方法?
C#中的实体模型:
bool AreYouSwedishFemale(Human patient)
{
if(patient.isFemale && patient.isSwedish) {return true;}
else {return false;}
}
int PlayTetris(Human patient)
{
return someInt;
}
void myMainLoop()
{
Human[] testSubjects = {humanA, humanB, humanC};
Human dreamGirl;
int lowestScoreSoFar; //What should this be?
//Loop through testSubjects
foreach(Human testSubject in testSubjects)
{
//Check if it's a Swedish Female
if(AreYouSwedishFemale(testSubject))
{
//If so, compare her score to the lowest score so far
if(PlayTetris(testSubject) < lowestScoreSoFar) //Error, uninitialized variable
{
//If the lowest, save the object to a variable
dreamGirl = testSubject;
//And save the score, to compare the remaining scores to it
lowestScoreSoFar = PlayTetris(testSubject);
}
}
}
//In the end we have the result
dreamGirl.marry();
}
是的,我并不是真的在寻找用俄罗斯方块打败的女孩,我在Unity中编码,但我试图保持这一点与上下文无关。
您只需在PlayTetris()检查之前对"迄今为止的最低分数"进行初始化检查。假设最低分数为0,则可以将最低分数初始化为-1。然后将循环编辑为
//Loop through testSubjects
foreach(Human testSubject in testSubjects)
{
//Check if it's a Swedish Female
if(AreYouSwedishFemale(testSubject))
{
if( lowestScoreSoFar < 0 || PlayTetris(testSubject) < lowestScoreSoFar)
{
//If the lowest, save the object to a variable
dreamGirl = testSubject;
//And save the score, to compare the remaining scores to it
lowestScoreSoFar = PlayTetris(testSubject);
}
}
}
基本上,如果你的"迄今为止的最低分数"还没有设定,那么你找到的第一位瑞典女性就会设定。
如果出于某种原因,分数是任意的,你也可以在找到第一个女孩时发出"lowestWasSet"的bool,而不是-1。
更好的是,你也可以只做(dreamGirl==null)而不是,因为在你找到第一位瑞典女性之前,你的梦中女孩是null。C#使其OR检查短路,因此第一个通过的条件将立即跳到块中。因此dreamGirl==null将被视为true,并且PlayTetris()<lowestScoreSoFar不会引发未初始化的错误。