comment vérifier si l'élément List <T> contient un élément avec une valeur de propriété particulière


113
public class PricePublicModel
{
    public PricePublicModel() { }

    public int PriceGroupID { get; set; }
    public double Size { get; set; }
    public double Size2 { get; set; }
    public int[] PrintType { get; set; }
    public double[] Price { get; set; }
}

List<PricePublicModel> pricePublicList = new List<PricePublicModel>();

Comment vérifier si l'élément de pricePublicListcontient une certaine valeur. Pour être plus précis, je veux vérifier s'il existe pricePublicModel.Size == 200? Aussi, si cet élément existe, comment savoir de quel élément il s'agit?

EDIT Si Dictionary est plus approprié pour cela, je pourrais utiliser Dictionary, mais j'aurais besoin de savoir comment :)

Réponses:


186

Si vous avez une liste et que vous voulez savoir où dans la liste existe un élément qui correspond à un critère donné, vous pouvez utiliser la FindIndexméthode d'instance. Tel que

int index = list.FindIndex(f => f.Bar == 17);

Où f => f.Bar == 17est un prédicat avec les critères correspondants.

Dans votre cas, vous pourriez écrire

int index = pricePublicList.FindIndex(item => item.Size == 200);
if (index >= 0) 
{
    // element exists, do what you need
}

1
et si je ne connais pas l'attribut de cette valeur? Par exemple, j'ai un élément de liste qui affiche "18,00" Je ne sais pas d'où il vient donc je veux vérifier quel attribut a cette valeur? donc fondamentalement, et de manière similaire à cet exemple, je n'ai pas le .size ou .bar je veux le comprendre
— Haithem KAROUI

et si l'élément n'existe pas: quelle sera la valeur d'index?
— BKSpurgeon

8
REMARQUE: si l'élément n'existe pas, findIndexretournera –1. Documentation: msdn.microsoft.com/es-es/library/x1xzf2ca(v=vs.110).aspx
— tomloprod

1
@tomloprod c'est pourquoi il recherche un index supérieur ou égal à zéro. si (index> = 0). Aurait pu aussi l'écrire comme si (index> -1).
— DannyC

127
bool contains = pricePublicList.Any(p => p.Size == 200);

6
C'est strictement pour voir s'il en existe un.
— Daniel A. White

3
Cela ne répond pas vraiment à la question. Il a dit,how to know which one is it
— George Johnston

15
Peut-être ne pas répondre à sa question, mais cela m'a certainement aidé, car j'avais besoin de voir si un objet avec un nom donné existe déjà dans ma collection. Je m'attendais à une méthode .Contains améliorée - et c'est exactement ce que fait cette expression LINQ. Je vous remercie.
— Igor

3
Il répond à la question dans le titre . OP explique dans sa description qu'il ne veut pas vraiment exactement ce qu'il a dit vouloir. Pourtant, il y en a un parmi lui, et des dizaines d'entre nous trouvent cette question via Google. Je pense qu'il est plus important que nous puissions trouver la vraie réponse à sa question sur le titre.
— MGOwen

5
Si quelqu'un essaie ceci et que .Any () n'est pas reconnu, vous devez ajouter en utilisant System.Linq; en haut de votre dossier.
— MGOwen

32

Vous pouvez utiliser le existe

if (pricePublicList.Exists(x => x.Size == 200))
{
   //code
}

13

C'est assez facile à faire avec LINQ:

var match = pricePublicList.FirstOrDefault(p => p.Size == 200);
if (match == null)
{
    // Element doesn't exist
}

Est-il possible d'éditer directement l'élément qui correspond à cette condition? Ne pas l'obtenir et le stocker dans un nouvel objet, mais changer directement?
— ilija veselica

La matchvaleur renvoyée peut être modifiée (c'est l' PricePublicModelobjet qui était dans la liste).
— Jacob

Vous ne devez pas modifier directement un objet qui peut être nul. Vous pouvez toujours faire: match.Size = 300;ou foreach(var item in pricePublicList.Where(p => p.Size == 200)) item.Size = 300;. Je ne l'utiliserais pas moi-même comme une seule ligne, cependant.
— Amy West

11

Vous ne devez pas vraiment LINQ pour cela car List<T>fournit une méthode qui fait exactement ce que vous voulez: Find.

Recherche un élément qui correspond aux conditions définies par le prédicat spécifié et renvoie la première occurrence dans l'ensemble List<T>.

Exemple de code:

PricePublicModel result = pricePublicList.Find(x => x.Size == 200);

4
var item = pricePublicList.FirstOrDefault(x => x.Size == 200);
if (item != null) {
   // There exists one with size 200 and is stored in item now
}
else {
  // There is no PricePublicModel with size 200
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.