2010-10-13 3 views
44

j'ai ce code:trouver si un entier existe dans une liste d'entiers

List<T> apps = getApps(); 

     List<int> ids; 

     List<SelectListItem> dropdown = apps.ConvertAll(c => new SelectListItem 
     { 
      Selected = ids.Contains(c.Id), 
      Text = c.Name, 
      Value = c.Id.ToString() 
     }).ToList(); 


ids.Contains 

semble revenir toujours faux, même si les chiffres ne correspondent

des idées?

+9

Non, c'est à peu près la façon dont vous le faites. – mquander

+0

mquander a raison - peut-être vous pouvez essayer un petit exemple comme Liste foo = new Liste (); pour (int i = 0; i <10; ++ i) {toto.Add (i); } Console.WriteLine (foo.Contains (2)); –

+0

Je suppose que vous avez un bug ailleurs. Cette approche DEVRAIT fonctionner. –

Répondre

68

Si vous avez juste besoin d'un vrai/faux résultat

bool isInList = intList.IndexOf(intVariable) != -1; 

si le intVariable n'existe pas dans la liste renverra -1

+1

'IndexOf' est basé sur zéro. Cela devrait être '> = 0' :) –

+5

Ou vraiment, il devrait juste vérifier'! = -1' puisque la valeur de retour -1 est définie comme le résultat négatif. –

+0

merci pour les commentaires, les bons points –

45

Tant que votre liste est initialisé avec des valeurs et que la valeur existe réellement dans la liste, alors Contains devrait renvoyer true.

J'ai essayé les éléments suivants:

var list = new List<int> {1,2,3,4,5}; 
var intVar = 4; 
var exists = list.Contains(intVar); 

Et est en effet EXISTE à true.

+0

OP mis à jour sa question à laquelle vous répondez. sa liste d'identifiants ne semble pas être initialisée. Cela ne devrait-il pas être un attrape-compilateur? –

+0

Ouais. Une liste non initialisée devrait provoquer une erreur de compilation. Mais pas si la liste est définie au niveau de la classe, alors elle sera initialisée à null et le compilateur sera heureux. –

3

La façon dont vous avez fait est correcte. Cela fonctionne bien avec ce code: x est vrai. probablement vous avez fait une erreur ailleurs.

List<int> ints = new List<int>(new[] {1,5,7}); 
var i = 5; 
var x = ints.Contains(i); 
0

Vous devriez référencez Selected pas ids.Contains la dernière ligne.

Je viens de me rendre compte qu'il s'agit d'un problème de formatage, à partir de l'OP. Peu importe, vous devriez référencer la valeur dans Selected. Je recommande d'ajouter des appels Console.WriteLine pour voir exactement ce qui est imprimé sur chaque ligne et aussi ce que chaque valeur est. Après votre mise à jour: ids est une liste vide, comment cela ne lance-t-il pas une exception NullReferenceException? Comme il n'a jamais été initialisé dans ce bloc de code

3

Voici une méthode d'extension, qui permet de coder comme la commande SQL IN.

public static bool In<T>(this T o, params T[] values) 
{ 
    if (values == null) return false; 

    return values.Contains(o); 
} 
public static bool In<T>(this T o, IEnumerable<T> values) 
{ 
    if (values == null) return false; 

    return values.Contains(o); 
} 

Cela permet à des trucs comme ça:

List<int> ints = new List<int>(new[] {1,5,7}); 
int i = 5; 
bool isIn = i.In(ints); 

Ou:

int i = 5; 
bool isIn = i.In(1,2,3,4,5); 
1
bool vExist = false; 
int vSelectValue = 1; 

List<int> vList = new List<int>(); 
vList.Add(1); 
vList.Add(2); 

IEnumerable vRes = (from n in vListwhere n == vSelectValue); 
if (vRes.Count > 0) { 
    vExist = true; 
} 
Questions connexes