web-dev-qa-db-fra.com

Récupère la chaîne du tableau ou définit la valeur par défaut dans une ligne

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.

13
Roy Berris

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;
0

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;
}
0
mjwills