Donc nous avons ??
pour analyser sa valeur de droite lorsque la main gauche est nulle. Quel est l'équivalent pour un string[]
.
Par exemple
string value = "One - Two"
string firstValue = value.Split('-')[0] ?? string.Empty;
string secondValue = value.Split('-')[1] ?? string.Empty;
L'exemple ci-dessus planterait toujours si nous essayions d'obtenir un troisième index ou si string value = "One"
. Parce qu'il n'est pas nul mais IndexOutOfRangeException
est levé.
https://docs.Microsoft.com/en-us/dotnet/api/system.indexoutofrangeexception
Alors, quelle est une solution en ligne pour résoudre le problème ci-dessus? Je voudrais éviter le scénario try-catch car cela donne du code laid.
Je veux tirer profit d'un string[]
avec un string.Empty
comme valeur de sauvegarde, donc mon string
n'est jamais null
.
Peut-être que le code suivant sera utile
string value = "One - Two";
string firstValue = (value.Split('-').Length == 1 ? value.Split('-')[0] : null) ?? string.Empty;
string secondValue = (value.Split('-').Length == 2 ? value.Split('-')[1] : null) ?? string.Empty;
Une façon d'y parvenir est d'utiliser MoreLinq 's Lead
et la déstructuration des tuples:
string value = "One - Two";
var (first, second) = value.Split('-').Lead(1, string.Empty, (x, y) => (x, y)).First();
Ou, si vous souhaitez une approche plus générique qui fonctionne pour tous les indices:
string value = "One - Two - Three - Fourth - Fifth";
var (first, second) = value.Split('-').Skip(6).Concat(string.Empty).Lead(7, string.Empty, (x, y) => (x, y)).First();
Ce code obtiendra les septième et quatorzième entrées (aucune d'elles n'est là, donc string.Empty
Sera utilisé pour les deux).
Une autre option à considérer est d'affecter deux variables différentes sur la même ligne de code:
string value = "One - Two";
var split = value.Split('-');
string first = split[0] ?? string.Empty, second = split.ElementAtOrDefault(1) ?? string.Empty;
Cela vous donne trois lignes de code, de bonnes performances et un niveau raisonnable de clarté et de lisibilité.
Notez qu'il n'est pas nécessaire d'utiliser ElementOrDefault(0)
- mieux vaut utiliser [0]
Puisque Split
ne sera jamais retourne un tableau sans aucun élément.
Une autre option serait d'utiliser déstructuration - mais cela n'est vraiment utile que si vous êtes intéressé par des entrées contiguës au début du tableau (bien qu'il puisse être modifié pour prendre les paramètres d'index raisonnablement simplement):
public static void Destructure<T>(this T[] items, T defaultValue, out T t0, out T t1)
{
t0 = items.Length > 0 ? items[0] : defaultValue;
t1 = items.Length > 1 ? items[1] : defaultValue;
}