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

Mon application utilise une liste comme celle-ci:

List list = new List();

À l’aide de la méthode Add , une autre instance de MyClass est ajoutée à la liste.

MyClass fournit, entre autres, les méthodes suivantes:

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

Comment puis-je trouver une instance spécifique de MyClass en utilisant la méthode GetId ? Je sais qu’il existe la méthode Find , mais je ne sais pas si cela fonctionnerait ici?!

Utiliser une expression lambda

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

Remarque: C # a une syntaxe intégrée pour les propriétés. Au lieu d’écrire des méthodes Set et Get (comment vous y habituer depuis Java), écrivez

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

value est un mot-clé contextuel connu uniquement dans l’accesseur d’ensemble. Il représente la valeur atsortingbuée à la propriété.

Comme ce modèle est souvent utilisé, C # fournit des propriétés implémentées automatiquement. Ils sont une version courte du code ci-dessus; Cependant, la variable de sauvegarde est masquée et non accessible (elle est cependant accessible depuis la classe dans VB).

 public ssortingng Id { get; set; } 

Vous pouvez simplement utiliser les 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. ssortingng id = obj.Id; // Calls the getter. 

En utilisant les propriétés, vous rechercheriez les éléments de la liste comme ceci

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

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

 public ssortingng Id { get; private set; } 

Cela vous permet de définir l’ Id dans la classe mais pas de l’extérieur. Si vous devez également le définir dans des classes dérivées, vous pouvez également protéger le setter

 public ssortingng Id { get; protected set; } 

Et enfin, vous pouvez déclarer les propriétés comme virtual et les remplacer dans les classes dérivées, ce qui vous permet de fournir différentes implémentations pour les getters et les setters; comme pour les méthodes virtuelles ordinaires.


Depuis C # 6.0 (Visual Studio 2015, Roslyn), vous pouvez écrire des propriétés automatiques de lecture seule avec un initialiseur en ligne

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

Vous pouvez également initialiser les propriétés de lecture seule dans le constructeur. Les propriétés auto-sélectionnables sont de véritables propriétés en lecture seule, contrairement aux propriétés implémentées automatiquement avec un setter privé.

Cela fonctionne également avec les propriétés automatiques en lecture-écriture:

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

À partir de C # 6.0, vous pouvez également écrire des propriétés en tant que membres avec expression

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

Voir: Plate-forme de compilation .NET (“Roslyn”)
Nouvelles fonctionnalités linguistiques en C # 6

A partir de C # 7.0 , getter et setter peuvent être écrits avec des corps d’expression:

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

Notez que dans ce cas, le setter doit être une expression. Cela ne peut pas être une déclaration. L’exemple ci-dessus fonctionne, car en C #, une affectation peut être utilisée comme une expression ou une déclaration. La valeur d’une expression d’affectation correspond à la valeur atsortingbuée où l’affectation elle-même est un effet secondaire. Cela vous permet d’atsortingbuer une valeur à plusieurs variables à la fois: x = y = z = 0 est équivalent à x = (y = (z = 0)) et a le même effet que les instructions x = 0; y = 0; z = 0; x = 0; y = 0; z = 0; .

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

ou s’il n’y en a qu’un et que vous voulez faire en sorte que quelque chose comme SingleOrDefault soit ce que vous voulez

 var item = list.SingleOrDefault( x => x.GetId() == "TARGET" ); if ( item == null ) throw new Exception(); 

Essayer:

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

Vous pouvez également utiliser les extensions LINQ :

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

Vous pouvez résoudre votre problème de manière plus concise avec un prédicat écrit en utilisant une syntaxe de méthode anonyme:

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

Ou si vous ne préférez pas utiliser LINQ, vous pouvez le faire à l’ancienne:

 List list = new List(); 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 DealCategory { get; set; } int categoryid = Convert.ToInt16(dealsModel.DealCategory.Select(x => x.Id));