2017-05-06 1 views
0

J'ai un processus automatisé qui génère des Uri localisés, puis les compare à une liste recueillie à partir d'une source distante dans le nuage. Quand on utilise Uri.Compare sur les chemins, si l'un des chemins contient une barre oblique différente (soit / vs \) il signale un 1 au lieu de O.Uri Comparer pour gérer le slash

Comme une comparaison de /sites/OmegaSandbox\Shared Documents par rapport à /sites/OmegaSandbox/Shared Documents.

Comment peut-on normaliser le uri efficacement, ou pour régler la méthode Compare pour gérer la situation différente de barre oblique à l'aide des outils existants dans .Net?

Supposition

Path.Combine("/sites/OmegaSandbox", "Shared Documents") 

va générer cette chaîne

/sites/OmegaSandbox \ Documents partagés

qui est le début de la question. Une question auxiliaire pourrait être comment obtenir Path.Combine pour respecter la direction de barre oblique d'entrée de main gauche? Maintenant, à ce stade, il est certain que vous pouvez écrire une opération de remplacement de l'expression régulière comme Regex.Replace(" ... ", @"(\\)", "/") pour échanger les barres obliques et c'est ce que je devrais faire.

Mais la bête StackOverflow doit être nourrie et cette question est de la viande rouge non?

Exemple

string uri1 = Path.Combine("/sites/OmegaSandbox", "Shared Documents"); 
string uri2 = @"/sites/OmegaSandbox/Shared Documents"; 

var u1 = new Uri(uri1, UriKind.Relative); 
var u2 = new Uri(uri2, UriKind.Relative); 

Uri.Compare(u1, u2, UriComponents.Fragment, 
        UriFormat.SafeUnescaped, 
        StringComparison.CurrentCultureIgnoreCase); 

Le Uri.Compare ci-dessus, peu importe quels attributs sont définis, ne reviendra un 0.


Y at-il de la route de la boîte pour obtenir le Compare ou Combine de travailler avec différentes barres obliques?

+0

Changer '' partagée Documents' à SharedDocuments' (sans espace) a le même résultat . – OmegaMan

Répondre

1

Avez-vous essayé d'ajouter une méthode d'extension avec la coutume comme logique de comparaison

public static class UriExtension 
{ 
    public static bool EqualityCheck(this Uri uri, Uri anotherUri) 
    { 
     return uri.OriginalString.Replace(@"\", @"/").Equals(anotherUri.OriginalString.Replace(@"\", @"/")); 
    } 
} 

et l'utiliser comme

var u1 = new Uri(uri1, UriKind.Relative); 
var u2 = new Uri(uri2, UriKind.Relative); 

u1.EqualityCheck(u2); 
+0

Votre réponse est correcte, mais mon intention est de savoir si la méthode 'Uri' ou' Compare' pourrait être ajustée pour faire cette normalisation hors de la boîte. Merci cependant d'avoir essayé. +1 pour l'essai :-) – OmegaMan

+0

La section Remarques dans [Uri.Compare] (https://msdn.microsoft.com/en-us/library/system.uri.compare (v = vs.110) .aspx) documentation dit clairement que Si les deux URL sont relatives, elle utilisera la chaîne standard.Comparer (String, String, StringComparison) méthode de comparaison – Gururaj

+0

Ugg, c'est comme acheter une voiture et vous me dites de lire les petits caractères. lol. Bonne trouvaille ... mais si ce n'est pas un fragment ... cela change-t-il des choses que je me demande. – OmegaMan