Как я могу найти определенный элемент в List <T>?

В моем приложении используется следующий список:

List<MyClass> list = new List<MyClass>();

Используя метод Add, в список добавляется еще один экземпляр MyClass.

MyClass предоставляет, среди прочего, следующие методы:

public void SetId(String Id);
public String GetId();

Как я могу найти конкретный экземпляр MyClass с помощью метода GetId? Я знаю, что есть метод Find, но я не знаю, будет ли это работать здесь?!

Ответ 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)).

Ответ 2

var list = new List<MyClass>();
var item = list.Find( x => x.GetId() == "TARGET_ID" );

или если есть только один, и вы хотите, чтобы что-то вроде SingleOrDefault могло быть тем, что вы хотите

var item = list.SingleOrDefault( x => x.GetId() == "TARGET" );

if ( item == null )
    throw new Exception();

Ответ 3

Try:

 list.Find(item => item.id==myid);

Ответ 4

Вы также можете использовать расширения LINQ:

string id = "hello";
MyClass result = list.Where(m => m.GetId() == id).First();

Ответ 5

Вы можете наиболее точно решить свою проблему с помощью предиката, написанного с использованием анонимного синтаксиса метода:

MyClass found = list.Find(item => item.GetID() == ID);

Ответ 6

Или, если вы не предпочитаете использовать LINQ, вы можете сделать это в старой школе:

List<MyClass> list = new List<MyClass>();
foreach (MyClass element in list)
{
    if (element.GetId() == "heres_where_you_put_what_you_are_looking_for")
    {

        break; // If you only want to find the first instance a break here would be best for your application
    }
}