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