c# - tomar - ¿Cómo puedo encontrar un elemento específico en una Lista<T>?
saber si un elemento existe en una lista c# (7)
O si no prefiere usar LINQ , puede hacerlo a la manera de la vieja escuela:
List<MyClass> list = new List<MyClass>();
foreach (MyClass element in list)
{
if (element.GetId() == "heres_where_you_put_what_you_are_looking_for")
{
break; // If you only want to find the first instance a break here would be best for your application
}
}
Mi aplicación usa una lista como esta:
List<MyClass> list = new List<MyClass>();
Usando el método Add
, se agrega otra instancia de MyClass
a la lista.
MyClass
proporciona, entre otros, los siguientes métodos:
public void SetId(String Id);
public String GetId();
¿Cómo puedo encontrar una instancia específica de MyClass
utilizando el método GetId
? Sé que existe el método Find
, pero no sé si esto funcionaría aquí?
Puede resolver su problema de forma más concisa con un predicado escrito usando la sintaxis del método anónimo:
MyClass found = list.Find(item => item.GetID() == ID);
También puedes usar extensiones LINQ :
string id = "hello";
MyClass result = list.Where(m => m.GetId() == id).First();
Tratar:
list.Find(item => item.id==myid);
Usa una expresión lambda
MyClass result = list.Find(x => x.GetId() == "xy");
Nota: C # tiene una sintaxis incorporada para las propiedades. En lugar de escribir Set-and Get-methods (cómo podría usarlo desde Java), escriba
private string _id;
public string Id
{
get
{
return _id;
}
set
{
_id = value;
}
}
value
es una palabra clave contextual que solo se conoce en el acceso del conjunto. Representa el valor asignado a la propiedad.
Como este patrón se usa a menudo, C # proporciona propiedades implementadas automáticamente. Son una versión corta del código anterior; sin embargo, la variable de respaldo está oculta y no es accesible (se puede acceder desde dentro de la clase en VB, sin embargo).
public string Id { get; set; }
Simplemente puede usar las propiedades como si estuviera accediendo a un campo:
var obj = new MyClass();
obj.Id = "xy"; // Calls the setter with "xy" assigned to the value parameter.
string id = obj.Id; // Calls the getter.
Usando propiedades, buscaría elementos en la lista como este
MyClass result = list.Find(x => x.Id == "xy");
También puede usar propiedades implementadas automáticamente si necesita una propiedad de solo lectura:
public string Id { get; private set; }
Esto le permite establecer el Id
dentro de la clase pero no desde el exterior. Si necesita configurarlo también en clases derivadas, también puede proteger al colocador
public string Id { get; protected set; }
Y, por último, puede declarar propiedades como virtual
y anularlas en clases derivadas, lo que le permite proporcionar diferentes implementaciones para getters y setters; al igual que para los métodos virtuales ordinarios.
Desde C # 6.0 (Visual Studio 2015, Roslyn) puede escribir auto-propiedades getter solamente con un inicializador en línea
public string Id { get; } = "A07"; // Evaluated once when object is initialized.
También puede inicializar propiedades getter solamente dentro del constructor. Las auto-propiedades Getter-only son verdaderas propiedades de solo lectura, a diferencia de las propiedades implementadas automáticamente con un setter privado.
Esto también funciona con auto-propiedades de lectura-escritura:
public string Id { get; set; } = "A07";
A partir de C # 6.0 también puede escribir propiedades como miembros con cuerpo de expresión
public DateTime Yesterday => DateTime.Date.AddDays(-1); // Evaluated at each call.
// Instead of
public DateTime Yesterday { get { return DateTime.Date.AddDays(-1); } }
Ver: .NET Compiler Platform ("Roslyn")
Nuevas características de lenguaje en C # 6
Comenzando con C # 7.0 , ambos, getter y setter, se pueden escribir con cuerpos de expresión:
public string Name
{
get => _name; // getter
set => _name = value; // setter
}
Tenga en cuenta que en este caso el colocador debe ser una expresión. No puede ser una declaración. El ejemplo anterior funciona, porque en C #, una asignación se puede usar como una expresión o como una declaración. El valor de una expresión de asignación es el valor asignado donde la asignación en sí es un efecto secundario. Esto le permite asignar un valor a más de una variable a la vez: x = y = z = 0
es equivalente a x = (y = (z = 0))
y tiene el mismo efecto que las declaraciones x = 0; y = 0; z = 0;
x = 0; y = 0; z = 0;
.
public List<DealsCategory> DealCategory { get; set; }
int categoryid = Convert.ToInt16(dealsModel.DealCategory.Select(x => x.Id));
var list = new List<MyClass>();
var item = list.Find( x => x.GetId() == "TARGET_ID" );
o si solo hay uno y quiere hacer cumplir que algo como SingleOrDefault
puede ser lo que quiera
var item = list.SingleOrDefault( x => x.GetId() == "TARGET" );
if ( item == null )
throw new Exception();