Użyj wyrażenia lambda
MyClass result = list.Find(x => x.GetId() == "xy");
Uwaga: język C # ma wbudowaną składnię właściwości. Zamiast pisać metody pobierające i ustawiające (do czego przyzwyczaiłeś się w Javie), napisz
private string _id;
public string Id
{
get
{
return _id;
}
set
{
_id = value;
}
}
value
jest kontekstowym słowem kluczowym znanym tylko z metody dostępu set. Reprezentuje wartość przypisaną do właściwości.
Ponieważ ten wzorzec jest często używany, C # zapewnia właściwości implementowane automatycznie . Są krótką wersją powyższego kodu; jednak zmienna zapasowa jest ukryta i niedostępna (jest jednak dostępna z poziomu klasy w VB).
public string Id { get; set; }
Możesz po prostu użyć właściwości tak, jakbyś uzyskiwał dostęp do pola:
var obj = new MyClass();
obj.Id = "xy"; // Calls the setter with "xy" assigned to the value parameter.
string id = obj.Id; // Calls the getter.
Korzystając z właściwości, można wyszukiwać elementy na liście w ten sposób
MyClass result = list.Find(x => x.Id == "xy");
Jeśli potrzebujesz właściwości tylko do odczytu, możesz również użyć właściwości zaimplementowanych automatycznie:
public string Id { get; private set; }
Umożliwia to ustawienie Id
wewnątrz klasy, ale nie z zewnątrz. Jeśli chcesz ustawić ją również w klasach pochodnych, możesz również chronić metodę ustawiającą
public string Id { get; protected set; }
I wreszcie, możesz zadeklarować właściwości jako virtual
i przesłonić je w klasach pochodnych, co pozwoli ci zapewnić różne implementacje dla metod pobierających i ustawiających; tak jak w przypadku zwykłych metod wirtualnych.
Od C # 6,0 (Visual Studio 2015, Roslyn) można pisać właściwości automatyczne tylko do pobierania za pomocą inicjatora wbudowanego
public string Id { get; } = "A07"; // Evaluated once when object is initialized.
Zamiast tego można również zainicjować właściwości tylko pobierające w konstruktorze. Getter tylko auto-właściwości są prawdziwymi właściwości tylko do odczytu, w przeciwieństwie do auto-wdrożone właściwości z prywatnym seter.
Działa to również z właściwościami automatycznymi do odczytu i zapisu:
public string Id { get; set; } = "A07";
Począwszy od języka C # 6,0 można również zapisywać właściwości jako elementy członkowskie zawierające wyrażenia
public DateTime Yesterday => DateTime.Date.AddDays(-1); // Evaluated at each call.
// Instead of
public DateTime Yesterday { get { return DateTime.Date.AddDays(-1); } }
Zobacz: Platforma kompilatora .NET („Roslyn”)
Nowe funkcje językowe w C # 6
Począwszy od języka C # 7.0 , zarówno getter, jak i setter, można zapisać za pomocą treści wyrażeń:
public string Name
{
get => _name; // getter
set => _name = value; // setter
}
Zauważ, że w tym przypadku ustawiacz musi być wyrażeniem. To nie może być stwierdzenie. Powyższy przykład działa, ponieważ w C # przypisanie może być używane jako wyrażenie lub jako instrukcja. Wartość wyrażenia przypisania to przypisana wartość, w przypadku której samo przypisanie jest efektem ubocznym. Pozwala to na przypisanie wartości do więcej niż jednej zmiennej naraz: x = y = z = 0
jest równoważne x = (y = (z = 0))
i ma taki sam efekt jak instrukcje x = 0; y = 0; z = 0;
.
Następna wersja języka, C # 9.0, prawdopodobnie dostępna w listopadzie 2020 r., Pozwoli na właściwości tylko do odczytu (lub lepiej zainicjuj raz), które można zainicjować w inicjatorze obiektu. Obecnie nie jest to możliwe w przypadku właściwości tylko pobierających.
public string Name { get; init; }
var c = new C { Name = "c-sharp" };
IQueryable<T> result = db.Set<T>().Find(//just id here//).ToList();
wiedziałoby już, że szukasz klucza podstawowego. Tylko dla informacji.