Comment puis-je trouver un élément spécifique dans une Liste?

ma demande utilise une liste comme celle-ci:

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

par la méthode Add , une autre instance de MyClass est ajoutée à la liste.

MyClass prévoit, entre autres, les méthodes suivantes:

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

Comment trouver une instance spécifique de MyClass en utilisant la méthode GetId ? Je sais qu'il y a la méthode Find , mais je ne sais pas si ce serait le travail ici?!

80
demandé sur Peter Mortensen 2012-03-24 23:43:16

8 réponses

utiliser une expression lambda

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

Remarque: C# possède une syntaxe pour les propriétés. Au lieu d'écrire Set-et Get-methods( comment vous pourriez être utilisé à partir de Java), écrivez

private string _id;
public string Id
{
    get
    {
        return _id;
    }
    set
    {
        _id = value;
    }
}

value est un mot-clé contextuel connu seulement dans le jeu accessor. Il représente la valeur attribuée à la propriété.

Puisque ce modèle est souvent utilisé, C# fournit automatiquement les propriétés implémentées. Il s'agit d'une version abrégée du code ci-dessus; cependant, la variable d'appui est cachée et non accessible (elle est accessible depuis la classe dans VB, cependant).

public string Id { get; set; }

vous pouvez simplement utiliser des propriétés comme si vous accédiez à un champ:

var obj = new MyClass();
obj.Id = "xy";       // Calls the setter with "xy" assigned to the value parameter.
string id = obj.Id;  // Calls the getter.

en utilisant propriétés, vous rechercheriez des éléments dans la liste comme ceci

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

vous pouvez également utiliser automatiquement les propriétés implémentées si vous avez besoin d'une propriété en lecture seule:

public string Id { get; private set; }

cela vous permet de régler le Id dans la classe mais pas de l'extérieur. Si vous avez besoin de le définir dans des classes dérivées, vous pouvez aussi protéger le setter

public string Id { get; protected set; }

et enfin, vous pouvez déclarer des propriétés comme virtual et les outrepasser en dérivant des classes, vous permettant de fournir différentes implémentations pour getters et setters; tout comme pour les méthodes virtuelles ordinaires.


depuis C# 6.0 (Visual Studio 2015, Roslyn) vous pouvez écrire des auto-propriétés getter-only avec un initialiseur en ligne

public string Id { get; } = "A07"; // Evaluated once when object is initialized.

vous pouvez aussi initialiser les propriétés getter-only dans le constructeur à la place. Les auto-propriétés Getter-only sont true propriétés read-only, contrairement à automatiquement propriétés implémentées avec un setteur privé.

cela fonctionne aussi avec des auto-propriétés de lecture-écriture:

public string Id { get; set; } = "A07";

en commençant par C# 6.0, vous pouvez aussi écrire des propriétés en tant que membres ayant un corps d'expression

public DateTime Yesterday => DateTime.Date.AddDays(-1); // Evaluated at each call.
// Instead of
public DateTime Yesterday { get { return DateTime.Date.AddDays(-1); } }

voir: .")

          Nouvelles Fonctionnalités du Langage C# 6

commençant par C# 7.0 , les deux, getter et setter, peuvent être écrits avec des corps d'expression:

public string Name
{
    get => _name;                                // getter
    set => _name = value;                        // setter
}

noter que dans ce cas le setter doit être une expression. Il ne peut pas être une déclaration. L'exemple ci-dessus fonctionne, parce que dans C# une tâche peut être utilisée comme une expression ou comme une instruction. La valeur d'une expression d'affectation est la valeur assignée lorsque la cession elle-même est un effet secondaire. Cela vous permet d'attribuer une valeur à plus d'une variable à une fois: x = y = z = 0 est équivalent à x = (y = (z = 0)) et a le même effet que les énoncés x = 0; y = 0; z = 0; .

195
répondu Olivier Jacot-Descombes 2018-09-20 15:09:00
var list = new List<MyClass>();
var item = list.Find( x => x.GetId() == "TARGET_ID" );

ou s'il n'y en a qu'un et que vous voulez faire appliquer que quelque chose comme SingleOrDefault peut être ce que vous voulez

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

if ( item == null )
    throw new Exception();
17
répondu zellio 2012-03-24 19:46:59

, Essayez:

 list.Find(item => item.id==myid);
7
répondu Amritpal Singh 2016-10-19 16:55:05

vous pouvez également utiliser LINQ extensions:

string id = "hello";
MyClass result = list.Where(m => m.GetId() == id).First();
4
répondu Guffa 2016-10-19 16:55:32

vous pouvez résoudre votre problème de la façon la plus concise avec un prédicat écrit en utilisant la syntaxe de la méthode anonyme:

MyClass found = list.Find(item => item.GetID() == ID);
3
répondu David Heffernan 2012-03-24 19:47:34

ou si vous ne préférez pas utiliser LINQ vous pouvez le faire à l'ancienne:

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
    }
}
3
répondu Bjørn 2016-10-19 16:57:21
public List<DealsCategory> DealCategory { get; set; }
int categoryid = Convert.ToInt16(dealsModel.DealCategory.Select(x => x.Id));
0
répondu Muhammad Armaghan 2018-06-20 09:33:03

vous pouvez créer une variable de recherche pour maintenir vos critères de recherche. Voici un exemple d'utilisation de la base de données.

 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

ici "var query" génère les critères de recherche que vous donnez à travers la variable de recherche. Puis " DuePaymentstring.Sélectionnez" est de sélectionner les données correspondant à vos critères donnés. N'hésitez pas à demander si vous avez un problème de compréhension.

0
répondu Khandkar Asif Hossain 2018-09-20 15:31:04