12
votes

Indexof avec Linq, acceptation d'expression de Lambda

Y a-t-il un moyen de trouver l'index de la liste des préfixes partiels avec Linq, quelque chose comme: xxx

malheureusement, indexofof () n'accepte pas la Lambda expression. Y a-t-il une méthode LINQ similaire pour cela?


3 commentaires

Eh bien, qu'attendez-vous que cela fasse? Quelle est votre production attendue?


Qu'est-ce que partialvalues ​​ type


@Arran, @sriramsakthivel, sa liste avec des valeurs telles que "-ms-", "-moz-", "-O-", etc.


4 Réponses :



34
votes

Vous n'avez pas besoin de linq du tout, list code> a une méthode FINDIDEX code> .

int indexOfPartial = PartialValues
  .Select((partialPrefix , index) => (partialPrefix , index))
  .Where(x => wholeValue.StartsWith(x.partialPrefix))
  .Select(x => x.index)
  .DefaultIfEmpty(-1)
  .First();


3 commentaires

Super! Exactement ce que je cherchais. Merci. :)


Le code LINQ ne semble pas être correct. Vous devez appeler .First () pour convertir la séquence en valeur. Notez que tenter d'utiliser .firstordefault () plutôt pour éviter que la manutention d'exception fera la valeur de l'index ambiguë: il contiendra 0 pour les deux cas lorsque l'article non trouvé et l'élément a été trouvé à la tête de la liste.


@firegurafiku: Je viens de remarquer que votre commentaire. Fixé. Maintenant, il a le même comportement que list.findindindex . Un bon exemple que LINQ n'est pas toujours plus lisible / concis.



5
votes

Tim a la réponse la plus correcte ( https://stackoverflow.com/a/19792531/467172 ), bien que Si vous vouliez réellement une méthode d'extension pour iEnumerable code>, vous pouvez le faire avec quelque chose comme ceci:

public static int IndexOf<T>(this IEnumerable<T> source, Func<T, bool> predicate)
{
    int index = 0;
    foreach (var item in source)
    {
        if (predicate(item)) return index;
        index++;
    }

    return -1;
}


0 commentaires

4
votes

Si vous avez Liste code>, voir réponse acceptée .

in cas, vous avez ienumerable code> (ou une autre collection qui le met en œuvre) au lieu de la liste code> code>, vous pouvez utiliser le code LINQ suivant: P>

int index = PartialValues.TakeWhile(partialPrefix=> ! wholeValue.StartsWith(partialPrefix)).Count();


0 commentaires