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

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.