2011-02-17 5 views
2

J'essaie de trouver l'index du premier élément d'un ArrayList dont la propriété 'tag' n'est pas nulle.ArrayList.IndexOf (caractère générique?)

Je pensais que je pouvais faire quelque chose à l'effet de

ArrayList.IndexOf(p => p.tag != null); 

ou

ArrayList.IndexOf(*.tag != null); 

mais aucun de ces travaux. Est-il possible d'utiliser IndexOf avec juste une propriété d'un objet?

+0

Quelle est la propriété « tag » de ArrayList? – naveen

+1

Si vous le pouvez, vous devez utiliser la liste au lieu de ArrayList. Les ArrayLists sont "démodé". Mais voir ma solution ci-dessous. – xanatos

+0

est ce .NET 2.0? LINQ est-il même une option? – BrokenGlass

Répondre

2

Essayez Array.FindIndex:

recherches pour un élément qui correspond à les conditions définies par le prédicat spécifié et retourne l'index de base zéro de la première occurrence au sein de la matrice entière.

+2

C'est pour un tableau. L'OP demandait une ArrayList. – xanatos

+0

Bien que j'ai demandé une ArrayList, la conversion en Array et l'utilisation de Array.FindIndex ont résolu mon problème. – Arkive

0

Si vous passez à l'aide d'une liste générique au lieu de ArrayList, vous pouvez le faire:

int index = list.FindIndex(p => p.tag != null); 

Sinon, vous êtes coincé avoir à boucle manuellement (gasp) dans la liste de tableau.

+0

Ou passez par la tricherie que Rune FS suggère. – Kon

0

si vous connaissez le type des objets que vous pourriez faire quelque chose comme ça

ArrayList list = ...; 
var elem = list.Cast<T>().Select((item,i) => new {item,Index = i}).FirstOrDefault(p => p.item.tag == null); 
var index = elem != null ? elem.Index : -1; 

fonctionnera si vous savez qu'il ya au moins un (pas l'esprit effecient vous

Cast transforme un IEnumerable en IEnumerable<T> ouvrant la porte au reste de LINQ

0
int index = a.Cast<T>() 
      .Select((p, q) => p != null && p.tag != null ? q + 1 : 0) 
      .FirstOrDefault(p => p > 0) - 1; 

Retours -1 si aucun élément trouvé.

0

Le problème avec IndexOf est que vous devez utiliser comme paramètre un objet dans la collection. Ce n'est pas une extension LINQ. C'est pourquoi cela échoue parce que votre lambda n'est pas dans la collection.

Vous pouvez également utiliser la requête LINQ suivante

ArrayList.IndexOf(ArrayList.First(x => p.tag != null))

Mais en ce qui concerne la performance, ce sera un peu pauvre (en regardant à travers la collection deux fois)

Vous devriez plutôt factoriser votre code comme suggéré par les réponses intelligentes autour de la mienne.

0

Si vous êtes désireux de le faire tout en utilisant l'ArrayList vous pouvez simplement appeler ToArray() puis faites votre FindIndex

Questions connexes