Verificați dacă o listă conține două elemente de diferite tipuri derivate

Vreau să verific o listă de elemente pentru a vedea dacă conține cel puțin două elemente dintr-un anumit tip derivat. În prezent, implementarea mea arată astfel:

    public override bool IsEnabledForTechnology(List enabledTechnologies)
    {
        return enabledTechnologies.Any(t => t.GetType() == typeof(TechnologyA)) && enabledTechnologies.Any(t => t.GetType() == typeof(TechnologyB));
    }

Care este cea mai eficientă afirmație pentru a obține acest lucru?

1

2 răspunsuri

Utilizați OfType pentru a filtra lista după tip:

public override bool IsEnabledForTechnology(List enabledTechnologies)
{
    return enabledTechnologies.OfType.Any() && 
           enabledTechnologies.OfType.Any();
}
4
adăugat
Nu este aceasta mai puțin eficientă deoarece "OfType <>" va itera întreaga listă în timp ce. Orice (...) va întoarce un bool imediat ce se va găsi o condiție potrivită?
adăugat autor Kim, sursa
Cred că acest lucru va fi evaluat leneș, astfel încât OfType să nu se repete, însă numai dacă este necesar pentru a îndeplini codul . Din MSDN: Această metodă este implementată prin utilizarea executării amânate. Valoarea returnării imediate este un obiect care stochează toate informațiile necesare pentru efectuarea acțiunii. Interogarea reprezentată de această metodă nu este executată până când obiectul nu este enumerat fie prin apelarea sa directă a metodei GetEnumerator, fie prin utilizarea foreach în Visual C# sau For Each în Visual Basic.
adăugat autor Avner Shahar-Kashtan, sursa
return enabledTechnologies.Any( t => { return (t.GetType() == typeof(TechnologyA)) && (t.GetType() == typeof(TechnologyB));} )

Aceasta elimină cel puțin un ciclu de foreach. De asemenea, poate înlocui t.GetType() cu variabila temporară în lambda, dar optimizatorul ar trebui să o facă pentru dvs.

0
adăugat