2009-02-02 38 views
13

Si tiene una lista, ¿cómo devuelve el artículo si existe una propiedad o conjunto de propiedades especificado?List.Contains (item) with generic list of objects

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" 


    } 
} 

Respuesta

23

Si está utilizando .NET 3.5 o mejor, LINQ es la respuesta a esta pregunta:

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

Si no utiliza .NET 3.5 a continuación, puedes recorrer y seleccionar las usted quiere.

+0

¿Por qué molestarse importando LINQ cuando Find, FindAll y Exists ya están definidos para la lista? – bdukes

+0

@bdukes Necro comentó la respuesta, simplemente no lo había notado antes :) Buscar en las versiones anteriores a 3.5 utilizó el operador de igualdad de objetos para determinar la igualdad. Podría suministrar el suyo, pero antes de 3.5 fue un dolor. Pero desde 3.5 agregaron la versión lambda donde puedes definir la igualdad según sea necesario. Dije LINQ porque era lo primero que pensé que coincidía con su pedido, pero creo que tienes razón, si ya tienes una lista, deberías usar los operadores integrados. Si tiene algo más que no los tiene, LINQ encajaría en la cuenta. – CubanX

+0

Sí, hay otras formas. Pero +1 por recordarme que puedo usar: 'SiteList.Where (s => s.GLCode == glcode);' en mi código. :-) – cbmeeks

26

Usted podría utilizar

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

+1 por mi usabilidad y gracias mate –

+0

+1 nuevamente por usabilidad. También http://stackoverflow.com/questions/1938204/linq-where-vs-findall – ruffrey

7

Si desea utilizar la aplicación de la igualdad de la clase, puede utilizar el método Contains. Dependiendo de cómo defina la igualdad (de manera predeterminada será referencial, lo que no será de ninguna ayuda), es posible que pueda ejecutar una de esas pruebas. También puede crear múltiples IEqualityComparer<T> s para cada prueba que desee realizar.

Alternativamente, para las pruebas que no dependen solo de la igualdad de la clase, puede usar el método Exists y pasar un delegado para probar (o Find si desea una referencia a la instancia correspondiente).

Por ejemplo, se podría definir la igualdad en la clase Testing así:

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

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

allí tendría que comprobar si la lista contiene un elemento con == valor3 3 con este código:

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

existe, podría hacer lo siguiente (primero con el delegado, en segundo lugar con lambda):

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

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

Una consulta LINQ probablemente sea la forma más fácil de codificar esto.

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

En C# necesitaría una cláusula de selección en la expresión de consulta. Es más fácil usar el método Where directamente en este caso, IMO. –

+0

Vaya. Agregado el seleccionar. Demasiado rebote entre vb.net y C#. –

Cuestiones relacionadas