J'ai une liste personnalisée Liste. qui renvoie tous les articles. La structure d'Info est la suivante:

public class Info
  {
    public string Code { get; set; }
    public string ClinicianDescription { get; set; }
  }

Je veux exclure tous les objets Info de la liste où la propriété Code est égale à n'importe quelle valeur dans une liste distincte.

Juste après une manière propre de faire cela, j'ai essayé d'utiliser .Except (), mais je devrais convertir la liste dans le même objet qui semble incorrect.

J'ai essayé quelque chose comme ça jusqu'à présent:

List<int> ids = contactList;
var List<Info> test = info.RemoveAll(x => ids.Any(i => i == x.Code));
2
the_tr00per 23 mai 2018 à 15:28

4 réponses

Meilleure réponse

Vous pouvez utiliser Except, bien que cela prenne un IEnumerable, pas un prédicat, et vous devez être prudent lorsque vous l'utilisez avec des classes personnalisées lors de la détermination de équivalence de deux objets

var blackListCodes = contactList.Select(i => i.ToString()); 
var test = info.Except(info.Where(i => blackListCodes.Contains(i.Code)));

Mais comme Tomassino l'a souligné, cela peut être inversé et simplifié comme suit:

var test = info.Where(i => !blackListCodes.Contains(i.Code))

Notez que cela projettera un nouveau Enumerable, plutôt que de changer des éléments dans le info existant, ce que RemoveAll fait.

Juste quelques autres points - concernant votre exemple de code:

  • Comme d'autres l'ont souligné, le type utilisé dans la correspondance Code doit être compatible dans la comparaison, c'est-à-dire que vous ne pouvez pas comparer string Code avec les entiers de ids. Ici, parce que nous utilisons .Except sur la même collection source, la comparaison des éléments fonctionnera comme prévu, même si elle repose sur l'égalité de référence par défaut (puisqu'il s'agit de la même référence d'élément dans les deux IEnumerables).

  • RemoveAll renvoie un entier représentant le nombre d'éléments élagués de la liste - le résultat ne peut pas être attribué à un autre List.

7
StuartLC 24 mai 2018 à 06:22

Vous pouvez également utiliser cette approche:

 List<Info> info = new List<Info>();
 //fill info with objects

 List<string> excludeCodes = new List<string>();
 //fill excludeCodes with values

 var result = info.Where(i => !excludeCodes.Contains(i.Code)).ToList();
2
Tomas Chabada 23 mai 2018 à 12:36

Vous essayez de comparer la chaîne avec int!

0
Deidah 23 mai 2018 à 12:54

Pourquoi ne pouvez-vous pas utiliser Contains() comme

List<Info> test = info
                     .Where(i => !ids.Contains(i.Code)).ToList();
0
Rahul 23 mai 2018 à 12:38