Use uma expressão lambda
MyClass result = list.Find(x => x.GetId() == "xy");
Nota: C # tem uma sintaxe interna para propriedades. Em vez de escrever métodos getter e setter (como você deve estar acostumado em Java), escreva
private string _id;
public string Id
{
get
{
return _id;
}
set
{
_id = value;
}
}
value
é uma palavra-chave contextual conhecida apenas no acessador set. Representa o valor atribuído à propriedade.
Como esse padrão é frequentemente usado, C # fornece propriedades implementadas automaticamente . Eles são uma versão resumida do código acima; no entanto, a variável de apoio está oculta e não acessível (ela é acessível de dentro da classe em VB, no entanto).
public string Id { get; set; }
Você pode simplesmente usar as propriedades como se estivesse acessando um 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 propriedades, você pesquisaria por itens na lista como este
MyClass result = list.Find(x => x.Id == "xy");
Você também pode usar propriedades implementadas automaticamente se precisar de uma propriedade somente leitura:
public string Id { get; private set; }
Isso permite que você defina o Id
dentro da classe, mas não de fora. Se você precisa configurá-lo em classes derivadas também, você também pode proteger o configurador
public string Id { get; protected set; }
E, finalmente, você pode declarar propriedades como virtual
e substituí-las em classes derivadas, permitindo fornecer diferentes implementações para getters e setters; assim como para métodos virtuais comuns.
Desde C # 6.0 (Visual Studio 2015, Roslyn), você pode escrever propriedades automáticas somente getter com um inicializador embutido
public string Id { get; } = "A07"; // Evaluated once when object is initialized.
Você também pode inicializar propriedades somente getter dentro do construtor. As propriedades automáticas somente getter são verdadeiras propriedades somente leitura, ao contrário das propriedades implementadas automaticamente com um configurador privado.
Isso também funciona com propriedades automáticas de leitura e gravação:
public string Id { get; set; } = "A07";
A partir do C # 6.0, você também pode escrever propriedades como membros com corpo de expressão
public DateTime Yesterday => DateTime.Date.AddDays(-1); // Evaluated at each call.
// Instead of
public DateTime Yesterday { get { return DateTime.Date.AddDays(-1); } }
Consulte: .NET Compiler Platform ("Roslyn")
Novos recursos de linguagem em C # 6
A partir do C # 7.0 , getter e setter podem ser escritos com corpos de expressão:
public string Name
{
get => _name; // getter
set => _name = value; // setter
}
Observe que, neste caso, o setter deve ser uma expressão. Não pode ser uma declaração. O exemplo acima funciona porque em C # uma atribuição pode ser usada como uma expressão ou como uma instrução. O valor de uma expressão de atribuição é o valor atribuído onde a própria atribuição é um efeito colateral. Isso permite que você atribua um valor a mais de uma variável de uma vez: x = y = z = 0
é equivalente ax = (y = (z = 0))
e tem o mesmo efeito que as declarações x = 0; y = 0; z = 0;
.
A próxima versão da linguagem, C # 9.0, provavelmente disponível em novembro de 2020, permitirá propriedades somente leitura (ou melhor inicializar uma vez) que você pode inicializar em um inicializador de objeto. Atualmente, isso não é possível com propriedades somente getter.
public string Name { get; init; }
var c = new C { Name = "c-sharp" };
IQueryable<T> result = db.Set<T>().Find(//just id here//).ToList();
Ele já saberia que você está procurando a chave primária. Apenas para informações.