Використовуйте лямбдаський вираз
MyClass result = list.Find(x => x.GetId() == "xy");
Примітка: C # має вбудований синтаксис властивостей. Замість того, щоб писати геттер і методи сеттера (як ви могли звикати з Java), пишіть
private string _id;
public string Id
{
get
{
return _id;
}
set
{
_id = value;
}
}
value
- це контекстне ключове слово, відоме лише у встановленому аксесуарі. Він представляє значення, присвоєне властивості.
Оскільки ця модель часто використовується, C # надає властивості, реалізовані автоматично . Вони є короткою версією коду вище; проте, змінна резервна копія прихована і недоступна (однак вона доступна з класу в VB, проте).
public string Id { get; set; }
Ви можете просто використовувати властивості, як якщо б ви отримували доступ до поля:
var obj = new MyClass();
obj.Id = "xy"; // Calls the setter with "xy" assigned to the value parameter.
string id = obj.Id; // Calls the getter.
Використовуючи властивості, ви б шукали елементи в цьому списку
MyClass result = list.Find(x => x.Id == "xy");
Ви також можете використовувати властивості, реалізовані автоматично, якщо вам потрібна властивість лише для читання:
public string Id { get; private set; }
Це дає змогу встановити Id
клас у межах, але не ззовні. Якщо вам також потрібно встановити його у похідних класах, ви також можете захистити сетер
public string Id { get; protected set; }
І, нарешті, ви можете оголосити властивості як virtual
і перекрити їх у похідних класах, що дозволяє вам надати різні реалізації для getters та setters; так само, як і для звичайних віртуальних методів.
Оскільки на C # 6.0 (Visual Studio 2015, Roslyn) ви можете записувати автоматичні властивості лише для отримання з допомогою вбудованого ініціалізатора
public string Id { get; } = "A07"; // Evaluated once when object is initialized.
Натомість можна також ініціалізувати властивості лише для getter у конструкторі. Автоматичні властивості лише для Getter - це справжні властивості лише для читання, на відміну від властивостей, що реалізуються автоматично з приватним сеттером.
Це також працює з автоматичними властивостями читання-запису:
public string Id { get; set; } = "A07";
Починаючи з C # 6.0, ви також можете записувати властивості як виразні члени
public DateTime Yesterday => DateTime.Date.AddDays(-1); // Evaluated at each call.
// Instead of
public DateTime Yesterday { get { return DateTime.Date.AddDays(-1); } }
Дивіться: .NET Compiler Platform ("Рослін")
Нові мовні функції в C # 6
Починаючи з C # 7.0 , і getter, і seter, можна записати з виразними телами:
public string Name
{
get => _name; // getter
set => _name = value; // setter
}
Зауважте, що в цьому випадку сеттер повинен бути виразом. Це не може бути твердженням. Наведений вище приклад працює, тому що в C # призначення може використовуватися як вираз або як вислів. Значення виразу присвоєння - це присвоєне значення, коли саме призначення є побічним ефектом. Це дозволяє призначити значення більш ніж одній змінній одночасно: x = y = z = 0
еквівалентно x = (y = (z = 0))
та має такий же ефект, як і заяви x = 0; y = 0; z = 0;
.
Наступна версія мови, C # 9.0, ймовірно, доступна в листопаді 2020 року, дозволить властивості лише для читання (або краще ініціалізувати один раз), які можна ініціалізувати в ініціалізаторі об'єктів. Наразі це неможливо із властивостями лише для отримання.
public string Name { get; init; }
var c = new C { Name = "c-sharp" };
IQueryable<T> result = db.Set<T>().Find(//just id here//).ToList();
вже знали б, що ви шукаєте первинний ключ. Просто для інформації.