2015-09-17 20 views
6

Sto unendo un carico di stringhe per creare una superstringa, ma ho bisogno di ignorare un parametro se uno è nullo. Al momento non riesco a pensare a come farlo se non includendo tutti i parametri in dichiarazioni separate. pls Aiuto:Come ignorare se var è nullo C#

Ecco il codice

public void LinkBuilder(string baselink, string sharedkey, string service, string period, string bulletintype, 
     string includeresults, string includemap, string username, string password) 
    { 
     sharedkey = "&" + sharedkey; 
     service = "&" + service; 
     period = "&" + period; 
     bulletintype = "&" + bulletintype; 
     includeresults = "&" + includeresults; 
     includemap = "&" + includemap; 
     username= "&" + username; 
     password = "&" + password; 

     string completeLink = sharedkey + service + period + bulletintype + includeresults + includemap + username + 
           password; 

Non sei sicuro di come affrontare questo.

+0

ha dimenticato di includere il baselink in completeLink. Non importa, ma ho pensato di farlo notare prima che lo faccia qualcun altro. –

+3

Oltre a qualsiasi altra cosa, sei sicuro di non aver bisogno di codificare URL dei parametri? E tu * davvero * vuoi mettere una password in un URL? –

+0

Stai parlando di 'public void Sample (chiave di stringa, string service = null)'? – Greg

risposta

22

Vorrei davvero refactoring in questo modo:

public void LinkBuilder(params string[] links) 
{ 
    string completeLink = String.Join("&", links.Where(x=>!String.IsNullOrEmpty(x))); 
} 
+4

Forse renderlo un parametro 'params', quindi il chiamante non ha nemmeno bisogno di creare l'array ... –

+1

per un facile utilizzo è possibile aggiungere la parola chiave params public void LinkBuilder (params string [] links) (http: // stackoverflow.com/questions/7580277/why-use-the-params-keyword) – fuchs777

+0

ok, penso che questo sia il vincitore, ma aggiungerei la parola chiave params agli argomenti del metodo - public void LinkBuilder (params string [] links) - in modo che l'utente possa ancora chiamarlo con un numero di stringhe separate da virgole - LinkBuilder (mybaselink, mysharedkey, myservice ...) - ma il metodo le accetta come array di stringhe. – AgapwIesu

1

È possibile eseguire un controllo delle stringhe dall'operatore?: Nel metodo.

public void LinkBuilder(string baselink, string sharedkey, string service, string period, string bulletintype, 
     string includeresults, string includemap, string username, string password) 
    { 
     sharedkey = checkValue(sharedkey); 
     service = checkValue(service); 
     period = checkValue(period); 
     bulletintype = checkValue(bulletintype); 
     includeresults = checkValue(includeresults); 
     includemap = checkValue(includemap); 
     username= checkValue(username); 
     password = checkValue(password); 

     string completeLink = sharedkey + service + period + bulletintype + includeresults + includemap + username + 
           password; 
} 
private String checkValue(String str) 
{ 
    return str != null ? "&" + str : ""; 
} 
+1

Ciò aggiungerà tutti i '&' s alla stringa sebbene – LInsoDeTeh

+0

utilizzi string.IsNullOrEmpty prima di eseguire l'assegnazione invece i.e: sharedKey = string.IsNullOrEmpty (sharedKey)? string.Empty: "&" + sharedKey –

+0

@LInsoDeTeh, grazie, corretto. – dremerDT

1

Fai raccolta enumerabile delle corde, usare un po 'di LINQ per filtrare i valori nulli, quindi unire il tutto di nuovo insieme con String.Join :

var elements = 
    new[]{baselink, sharedkey, service, period, 
      bulletintype, includeresults, includemap, 
      username, password}; 
var nonNullElements = elements.Where(e => e != null); 
var outputString = String.Join("&", nonNullElements); 

Sulla remota possibilità che si sta effettivamente cercando di assemblare un querystring, ci sono modi migliori.

Per esempio, si potrebbe sfruttare HttpUtility e la riflessione utilizzando il seguente metodo per l'analisi di un oggetto anonimo in una query string:

public static class ObjEx 
{ 
    public static string ToQueryString(this object data) 
    { 
     var collection = data.GetType() 
      .GetProperties() 
      .Aggregate(
       HttpUtility.ParseQueryString(string.Empty), 
       (prev,curr) => { 
        var val = curr.GetValue(data); 
        var propName = curr.Name; 
        prev.Add(propName,val.ToString()); 
        return prev; 
      }); 
     return collection.ToString(); 
    } 
} 

poi

var data = new{foo = "bar", num = 1, cat = "bad", dog = "good", needsEscaping = "é\"&"}; 
Console.WriteLine(data.ToQueryString()); 

vi darà:

foo=bar&num=1&cat=bad&dog=good&needsEscaping=%u00e9%22%26
1

Se l'obiettivo è evitare di avvolgere ciascun parametro in una sta Tement, li si potrebbe aggiungere a un elenco, quindi utilizzare String.Join, e Linq.Select

 public void LinkBuilder(string baselink, string sharedkey, string service, string period, string bulletintype, 
      string includeresults, string includemap, string username, string password) 
    { 
     var allParams = new List<string> 
     { 
      baselink, 
      sharedkey, 
      service, 
      period, 
      bulletintype, 
      includeresults, 
      includemap, 
      username, 
      password 
     }; 

     var completeLink = "?" + String.Join("&", allParams.Select(p => p != null)); 
    } 
1

seguito avrebbe accettato un Collection che mi sembra possa essere meglio gestibile. Sono stato ridipinto un po '.

public string LinkBuilder(Dictionary<string, string> parameters) 
{ 
    var url = String.Empty; 
    foreach(var parameter in parameters) 
     if(!string.IsNullOrEmpty(parameter.Value)) 
       url += String.Format("&{0}={1}", parameter.Key, parameter.Value); 

    return url; 
} 

In questo modo si potrebbe passare una raccolta per costruire l'URL, allora sarebbe return l'URL gigante per voi. Hai una vasta selezione, personalmente mi piace la risposta di Maksim.

Problemi correlati