Как я могу найти конкретный элемент в списке?
мое приложение использует список такой:
List<MyClass> list = new List<MyClass>();
С помощью Add
метод, другой экземпляр MyClass
добавляется в список.
MyClass
предусматривает, среди прочего, следующие методы:
public void SetId(String Id);
public String GetId();
как я могу найти конкретный экземпляр MyClass
С помощью GetId
способ? Я знаю, что есть Find
метод, но я не знаю, будет ли это работать здесь?!
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();
вы также можете использовать 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.Выбрать " - это выбор данных, соответствующих заданным критериям. Не стесняйтесь спрашивать, если у вас есть проблемы с пониманием.