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

ilija veselica
la source

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
}
Anthony Pegram
la source
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);
Daniel A. White
la source
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
}
Tiago
la source
13

C'est assez facile à faire avec LINQ:

var match = pricePublicList.FirstOrDefault(p => p.Size == 200);
if (match == null)
{
    // Element doesn't exist
}
Jacob
la source
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);
Mark Byers
la source
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
}
Mahesh Velaga
la source