2017-09-08 6 views
0

J'ai une chaîne comme ceci:Retour l'a déclaré à variable int.TryParse avec LINQ à partir d'une liste de chaînes

/Localisation/12345/

Mais je ne ai besoin le numéro 12345.

la fonction suivante retourne le nombre:

private int GetNumberFromString(string location = "/Location/12345/") 
    { 
     var id = 0; 
     var strings = location.Split(new[] { "/" }, StringSplitOptions.RemoveEmptyEntries); 
     strings.FirstOrDefault(t => int.TryParse(t, out id)); 
     return id; 
    } 

Je voudrais faire quelque chose comme ceci:

private int GetNumberFromString(string location = "/Location/12345/") 
    { 
     var strings = location.Split(new[] { "/" }, StringSplitOptions.RemoveEmptyEntries); 
     return strings.FirstOrDefault(t => int.TryParse(t, out var id)); 
    } 

Mais qui retourne chaîne et non int.

Est-il possible de déclarer l'ID de la variable dans int.TryParse et de le renvoyer immédiatement? Ou y a-t-il une meilleure solution pour cela?

+0

_ "Je voudrais faire quelque chose comme ça" _ - pourquoi? Vous renvoyez la première chaîne où la valeur de retour de int.TryParse() 'est' true', pas son 'int int id'. Quel problème essayez-vous de résoudre? Quelle "meilleure solution" recherchez-vous? Un code plus court n'est pas toujours meilleur. – CodeCaster

+0

Utilisez-vous C# 7.0? –

+0

"Existe-t-il une meilleure solution"? Eh bien, ce que vous demandez n'a pas beaucoup de sens - pour un, pourquoi exiger la déclaration d'un paramètre «out» en ligne? Quoi qu'il en soit, l'extraction d'un motif spécifique d'une chaîne est généralement résolue avec des expressions régulières: 'Convert.ToInt32 (Regex.Match ("/Location/12345/", @" \ d + "). Groups [0] .Value)' – BurnsBA

Répondre

0

Avec une regex?

return int.Parse(new Regex("\\d+").Match("/location/1234/").Groups[0].Value) 
+1

Pour une réponse réelle, je pourrais suggérer un modèle plus restrictif comme '@"/[^ /] +/(\ d +)/"'. Vous devrez également changer les 'Groupes [0]' à 'Groupes [1]' – BurnsBA

-1

Pas la meilleure solution, je suis sûr, mais cela fonctionne.

private int GetNumberFromStringLinq(string location = "/Location/12345/") 
     { 
      var strings = location.Split(new[] { "/" }, StringSplitOptions.RemoveEmptyEntries); 
      return Convert.ToInt32(strings.FirstOrDefault(t => int.TryParse(t, out var id))); 
     } 
+1

Ouais alors maintenant ils essaient d'abord d'analyser un int, puis de convertir la chaîne à un int quand cela réussit. – CodeCaster

+0

J'ai dit que ce n'était pas bon, mais ça marche. Le problème fondamental qu'ils ont besoin d'être refait, mais pour répondre à leur question spécifique, c'est ce qu'ils font. – gilliduck