Ma chaîne principale est,
"Lorem Ipsum est le texte factice standard de l'industrie depuis les années 1500 20 TN 123 34"
Je veux obtenir "123 34" uniquement à partir de la chaîne principale. J'ai fait par le code suivant.
string mainStr = " Lorem Ipsum has been the industry's standard dummy text ever since the 1500s 20 TN 123 34";
string filterStr = mainStr.Substring(0, mainStr.LastIndexOf(" "));
int sRange = filterStr.LastIndexOf(" ");
string outputStr = mainStr.Substring(sRange+1);
Comment faire par Linq way (juste une seule ligne est génial)?
5 Réponses :
Avec Linq:
int x1 = mainStr.Trim().IndexOf(" ");
int x2 = mainStr.Trim().LastIndexOf(" ");
int x3 = mainStr.Trim().LastIndexOf(" ", x2-1);
string firstWord = mainStr.Trim().Substring(0, x1);
string middleWord = mainStr.Trim().Substring(x1, x2 - x1);
string lastWord = mainStr.Trim().Substring(x2 + 1);
string output = mainStr.Trim().Substring(x3 + 1); // returns 123 34
vous pouvez utiliser LastOrDefault()
Meilleures performances:
string mainStr = " Lorem Ipsum has been the industry's standard dummy text ever since the 1500s 20 TN 123 34";
var reverse = mainStr.Split(' ').Reverse();
string output = reverse.Take(1).Last() + " " + reverse.Take(2).Last();
Utilisation de Linq
Si vous voulez vraiment faire dans Linq, vous pouvez faire ce qui suit.
123 34
Mais veuillez noter que cela ne serait pas recommandé en raison de deux instructions Reverse etc.
Utilisation de RegEx
Une meilleure option serait d'utiliser Regex
var result = Regex.Match(mainStr,@"(\w*)\s(\w*)*$").Value;
Sortie
var list = mainStr.Split(new []{" "},StringSplitOptions.RemoveEmptyEntries).Reverse().Take(2).Reverse();
Prendre les deux derniers éléments en utilisant linq peut être un peu illisible, donc je suggérerais une solution multiligne sans LastIndexOf ou Substring :
var lastTwoWords = string.Join(" ", mainStr.Split().Reverse().Take(2).Reverse());
Si vous en avez vraiment besoin pour linq, vous pouvez utiliser une combinaison de Reverse et Take:
string mainStr = " Lorem Ipsum has been the industry's standard dummy text ever since the 1500s 20 TN 123 34";
var words = mainStr.Split();
var lastTwoWords = string.Join(" ", words.Skip(words.Length - 2));
p>
Je déplacerais ce que vous avez déjà dans une méthode distincte (et je le rangerais un peu):
var outputStr = Regex.Match(mainStr, "\\s(\\S+\\s\\S+$)").Groups[0].Value;
Utilisation:
var outputStr = GetLast2Words(mainStr);
Vous pouvez également utiliser des expressions régulières:
public static string GetLast2Words(string mainStr)
{
int position = mainStr.LastIndexOf(' ', mainStr.LastIndexOf(' ') - 1);
return position >= 0 ? mainStr.Substring(position) : null;
}
\ s correspond aux espaces \ S correspond à n'importe quel caractère qui n'est pas un espace Notez que la méthode d'expression régulière affichera string.Empty s'il n'y a pas de correspondance, alors que la première méthode affichera null.
Cela pourrait être la solution si vous pouvez obtenir la longueur de la chaîne.
string mainStr = " Lorem Ipsum has been the industry's standard dummy text ever since the 1500s 20 TN 123 34"; string filterStr = String.Concat(mainStr.Skip(mainStr.Count() - 6)); Console.WriteLine(filterStr);
@John Je m'excuse, j'ai changé la deuxième ligne pour qu'elle affiche maintenant 123 34.
Après votre modification, votre code affiche "23 134" si nous changeons les 2 derniers mots en "123 134". Vous abordez cela de manière incorrecte, j'en ai bien peur.
@John Vous voulez donc une solution qui affiche toujours les 2 derniers mots quelle que soit leur taille. Je m'excuse, ma solution est erronée car elle suppose que le nombre total de caractères dans les deux derniers mots sera connu et sera toujours le même.
Une solution qui affiche toujours les 2 derniers mots équivaudrait au code fourni par le demandeur.
Je ne pense pas que LINQ soit particulièrement adapté à cela, car ce n'est pas vraiment une opération basée sur une collection. Personnellement, je préfère la lisibilité.
J'ai pensé, pour éviter une déclaration variable.