2009-02-02 18 views
13

Se si dispone di un elenco come si restituisce l'articolo se esiste una proprietà o una raccolta di proprietà specificata?List.Contains (elemento) con elenco di oggetti generico

public class Testing 
{ 
    public string value1 { get; set; } 
    public string value2 { get; set; } 
    public int value3 { get; set; } 
} 
public class TestingList 
{ 
    public void TestingNewList() 
    { 
     var testList = new List<Testing> 
          { 
           new Testing {value1 = "Value1 - 1", value2 = "Value2 - 1", value3 = 3}, 
           new Testing {value1 = "Value1 - 2", value2 = "Value2 - 2", value3 = 2}, 
           new Testing {value1 = "Value1 - 3", value2 = "Value2 - 3", value3 = 3}, 
           new Testing {value1 = "Value1 - 4", value2 = "Value2 - 4", value3 = 4}, 
           new Testing {value1 = "Value1 - 5", value2 = "Value2 - 5", value3 = 5}, 
           new Testing {value1 = "Value1 - 6", value2 = "Value2 - 6", value3 = 6}, 
           new Testing {value1 = "Value1 - 7", value2 = "Value2 - 7", value3 = 7} 
          }; 

     //use testList.Contains to see if value3 = 3 
     //use testList.Contains to see if value3 = 2 and value1 = "Value1 - 2" 


    } 
} 

risposta

23

Se si sta utilizzando .NET 3.5 o meglio, LINQ è la risposta a questa:

testList.Where(t => t.value3 == 3); 
testList.Where(t => t.value3 == 2 && t.value1 == "Value1 - 2"); 

Se non si utilizza .NET 3.5 allora si può solo scorrere e scegliere quelli tu vuoi.

+0

Perché preoccuparsi di importare LINQ quando Trova, Trova Tutto ed Esiste sono già definiti per l'elenco? – bdukes

+0

@bdukes Risposta ai commenti di Necro, semplicemente non l'avevamo notato prima :) Nelle versioni precedenti alla 3.5 usava l'operatore di uguaglianza degli oggetti per determinare l'uguaglianza. Potresti fornire il tuo, ma prima delle 3.5 era un dolore. Ma dal 3.5 hanno aggiunto la versione lambda in cui è possibile definire l'uguaglianza se necessario. Ho detto LINQ perché è stata la prima cosa che ho pensato che corrispondesse alla sua richiesta, ma penso che tu abbia ragione, se hai già una lista, dovresti usare gli operatori integrati. Se ha qualcos'altro che non ha quelli, LINQ sarebbe adatto al conto. – CubanX

+0

Sì, ci sono altri modi. Ma +1 per ricordarmi che posso usare: 'SiteList.Where (s => s.GLCode == glcode);' nel mio codice. :-) – cbmeeks

26

Si potrebbe utilizzare

testList.Exists(x=>x.value3 == 3) 
+0

+1 per la mia usabilità e grazie ancora –

+0

+1 per usabilità. Anche http://stackoverflow.com/questions/1938204/linq-where-vs-findall – ruffrey

7

Se si vuole usare l'esecuzione della classe di uguaglianza, è possibile utilizzare il metodo Contains. A seconda di come definite l'uguaglianza (per impostazione predefinita sarà referenziale, che non sarà di alcun aiuto), potreste essere in grado di eseguire uno di questi test. È inoltre possibile creare più IEqualityComparer<T> s per ciascun test che si desidera eseguire.

In alternativa, per i test che non si basano solo sull'eguaglianza della classe, è possibile utilizzare il metodo Exists e passare un delegato per testarlo (o Find se si desidera un riferimento all'istanza corrispondente).

Ad esempio, è possibile definire l'uguaglianza nella classe Testing in questo modo:

public class Testing: IEquatable<Testing> 
{ 
    // getters, setters, other code 
    ... 

    public bool Equals(Testing other) 
    { 
     return other != null && other.value3 == this.value3; 
    } 
} 

allora si sarebbe verificare se l'elenco contiene un elemento con valore3 == 3 con questo codice:

Testing testValue = new Testing(); 
testValue.value3 = 3; 
return testList.Contains(testValue); 

Per utilizzare esiste, è possibile effettuare le seguenti operazioni (prima con delega, secondo con lambda):

return testList.Exists(delegate(testValue) { return testValue.value3 == 3 }); 

return testList.Exists(testValue => testValue.value3 == 2 && testValue.value1 == "Value1 - 2"); 
1

Una query LINQ sarebbe probabilmente il modo più semplice per codificarlo.

Testing result = (from t in testList where t.value3 == 3 select t).FirstOrDefault(); 
+0

In C# avresti bisogno di una clausola select nell'espressione della query. È più facile utilizzare direttamente il metodo Where in questo caso, IMO. –

+0

Oops. Aggiunta la selezione. Troppi rimbalzi tra vb.net e C#. –