Det finns många fördelar med immutability. Prestandan behöver inte bli lidande för att man muterar datastrukturer men i ditt första exempel blev det en massa overhead då din lista behövde byggas om varje gång du körde RemoveAt på den (och dessutom plockade den bort kort lite underligt när jag tänker efter; först kort 0 (första), sedan kort 1 (dvs tredje kortet i original-Deck:en) sedan kort 2 (femte). Ett väldigt bra exempel på att det är svårare att följa det logiska flödet i en iterativ loop som muterar.
Du har fortfarande två variabler som muteras: boundary och anyDoublet. Faktum är att boundary är överflödig eftersom den håller samma värde som din i-variabel. En annan optimering du bör göra är att låta j börja på i+1. Detta gör att du kan skippa din inre if-sats. Ytterligare en optimering är att låta koden bryta sig ur looparna samtidigt som anyDoublets sätts till true: vid det tillfället garanteras att det finns minst en dublett och eftersom antalet dubletter är ointressant behöver ingen vidare kontroll av korten göras.
Utöver detta refererar cardList och deck.Cards till samma lista: du kan ersätta cardList med deck.Cards överallt.
Om du stoppar in hela kodsnutten i en metod blir du av med den sista muterande variabeln (bortsett från i och j) samtidigt som du kan bryta dig ur looparna:
bool AnyDoublets(List<Card> deck)
{
for (int i=0; i<deck.Count; i++)
{
for (int j=i+1; j<deck.Count; j++)
{
if (deck[i] == deck[j])
return true;
}
}
return false;
}
Eller, om man tycker att det är snyggare utan alla måsvingar (och gillar att spexa med generics och interfaces ):
bool AnyDoublets<T>(ICollection<IEquatable<T>> collection)
{
for (int i=0; i<collection.Count; i++)
for (int j=i+1; j<collection.Count; j++)
if (collection[i] == collection[j])
return true;
// default:
return false;
}
PS: Du måste som sagt implementera IEquatable<T>/en .Equals-metod på din Deck också, jag utgår ifrån att där finns en sådan. Om inte kommer du med stor sannolikhet aldrig hitta några dubletter.
edit: uppdatering, du måste använda antingen använda .Equals uttryckligen, eller overloada ==-operatorn. Om inte detta görs kommer du jämföra referenser med referenser, och inte objektets själva värde.
edit2: fler uppdateringar. Grymt trött nu.
edit3: god morgon! AnyDoublets (Doublet är förresten ett klädesplagg ) borde vara en metod på Deck-objektet. Då behöver du bara köra (cards.AnyDoublets()) för att få veta om där finns dubletter.