Используйте лямбда-выражение
MyClass result = list.Find(x => x.GetId() == "xy");
Примечание. C # имеет встроенный синтаксис для свойств. Вместо того, чтобы писать методы получения и установки (как вы, возможно, привыкли в Java), напишите
private string _id;
public string Id
{
get
{
return _id;
}
set
{
_id = value;
}
}
value
- контекстное ключевое слово, известное только в методе доступа set. Он представляет значение, присвоенное свойству.
Поскольку этот шаблон часто используется, 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
и переопределять их в производных классах, что позволяет вам предоставлять различные реализации для геттеров и сеттеров; как и для обычных виртуальных методов.
Начиная с C # 6.0 (Visual Studio 2015, Roslyn) вы можете писать автоматические свойства только для получения с помощью встроенного инициализатора.
public string Id { get; } = "A07"; // Evaluated once when object is initialized.
Вместо этого вы также можете инициализировать свойства только для получения в конструкторе. Автоматические свойства только для получения являются истинными свойствами, доступными только для чтения, в отличие от автоматически реализуемых свойств с частным установщиком.
Это также работает с автоматическими свойствами чтения-записи:
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 ("Roslyn")
Новые языковые возможности в C # 6
Начиная с C # 7.0 , оба метода получения и установки могут быть написаны с телами выражений:
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();
он уже знает, что вы ищете первичный ключ. Просто для информации.