Как я могу найти конкретный элемент в списке?


мое приложение использует список такой:

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

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

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

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

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

8 80

8 ответов:

использовать лямбда-выражение

MyClass result = list.Find(x => x.GetId() == "xy");

Примечание: C# имеет встроенный синтаксис для свойств. Вместо того, чтобы писать Set-и Get-методы (как вы могли бы использовать его с 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.

вместо этого можно инициализировать свойства только для геттера в конструкторе. Геттер-только авто-свойства правда свойства только для чтения, в отличие от автоматически реализованных свойств с частным сеттером.

это работает также с read-write auto-properties:

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;.

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();

попробуй:

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

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

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

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

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

или если вы не предпочитаете использовать 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
    }
}
public List<DealsCategory> DealCategory { get; set; }
int categoryid = Convert.ToInt16(dealsModel.DealCategory.Select(x => x.Id));

вы можете создать переменную поиска для хранения критериев поиска. Вот пример использования базы данных.

 var query = from o in this.mJDBDataset.Products 
             where o.ProductStatus == textBox1.Text || o.Karrot == textBox1.Text || o.ProductDetails == textBox1.Text || o.DepositDate == textBox1.Text || o.SellDate == textBox1.Text
             select o;
 dataGridView1.DataSource = query.ToList();
 //Search and Calculate
 search = textBox1.Text;
 cnn.Open();
 string query1 = string.Format("select * from Products where ProductStatus='"+ search +"'");
 SqlDataAdapter da = new SqlDataAdapter(query1, cnn);
 DataSet ds = new DataSet();
 da.Fill(ds, "Products");
 SqlDataReader reader;
 reader = new SqlCommand(query1, cnn).ExecuteReader();
 List<double> DuePayment = new List<double>();
 if (reader.HasRows)
 {
   while (reader.Read())
   {
      foreach (DataRow row in ds.Tables["Products"].Rows)
      {
         DuePaymentstring.Add(row["DuePayment"].ToString());
         DuePayment = DuePaymentstring.Select(x => double.Parse(x)).ToList();
      }
   }
   tdp = 0;
   tdp = DuePayment.Sum();                        
   DuePaymentstring.Remove(Convert.ToString(DuePaymentstring.Count));
   DuePayment.Clear();
}
cnn.Close();
label3.Text = Convert.ToString(tdp + " Due Payment Count: " + 
DuePayment.Count + " Due Payment string Count: " + DuePaymentstring.Count);
tdp = 0;
//DuePaymentstring.RemoveRange(0,DuePaymentstring.Count);
//DuePayment.RemoveRange(0, DuePayment.Count);
//Search and Calculate

здесь "var query" генерирует критерии поиска, которые вы даете через переменную поиска. Затем " DuePaymentstring.Выбрать " - это выбор данных, соответствующих заданным критериям. Не стесняйтесь спрашивать, если у вас есть проблемы с пониманием.