我有一個嵌套回圈,它正在檢查是否有Currency任何Wallet[]匹配Currency。Currency[] UtilityTokens在確定確實其中一個錢包包含實用程式令牌后,我想盡快打破我的嵌套回圈以繼續前進。
我當前的代碼如下:
bool walletContainsUtilityToken = false;
for(int i = 0; i < Wallets.Length; i )
{
foreach (Currency ut in ExchangeFunctions.UtilityTokens)
{
if (Wallets[i].Currency.Equals(ut))
{
walletContainsUtilityToken = true;
break;
}
}
if (walletContainsUtilityToken)
{
break;
}
}
這是打破嵌套回圈的適當方法嗎?有沒有一種不同的、更有效的做事方式?
uj5u.com熱心網友回復:
我們可以把它歸結為單線,它會做你想要的早期退出:
bool walletContainsUtilityToken = Wallets.Any(w => ExchangeFunctions.UtilityTokens.Any( ut => ut == w.Currency));
這個可能更容易理解(沒有嵌套,只有一個 -shorter- lambda):
bool walletContainsUtilityToken = Wallets.Select(w => w.Currency).Intersect(ExchangeFunctions.UtilityTokens).Any();
采用第二個選項,為了清楚起見,我實際上是這樣寫的:
bool walletContainsUtilityToken = Wallets.
Select(w => w.Currency).
Intersect(ExchangeFunctions.UtilityTokens).
Any();
如果你真的想繼續使用完整的回圈,我會像這樣對回圈條件添加一個檢查:
bool walletContainsUtilityToken = false;
for(int i = 0; i < Wallets.Length && !walletContainsUtilityToken; i )
{
foreach (Currency ut in ExchangeFunctions.UtilityTokens)
{
if (Wallets[i].Currency.Equals(ut))
{
walletContainsUtilityToken = true;
break;
}
}
}
最后,如果這些串列很大,您可以通過將它們預先安排到資料結構中以便更快地查找(即:字典,甚至支持二進制搜索的東西)來顯著提高性能。但這只有在串列足夠大的情況下才是勝利。
uj5u.com熱心網友回復:
可能你可以使用goto.
例子:
int val = 2;
for(int i = 0; i <4;i )
{
for (int j =0;j<4; j )
{
if (val == i)
goto LoopsFinished;
}
}
LoopsFinished:
val = 0;
uj5u.com熱心網友回復:
您的代碼非常好,如果您想要一個單行代碼,這里是 Linq 替代方案。
bool walletContainsUtilityToken = Wallets.Any(w => ExchangeFunctions.UtilityTokens.Any(ut => w.Currency.Equals(ut)));
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/476741.html
