2015-09-17 8 views
6

है तो मैं अनदेखा कैसे करूं, मैं सुपरस्टिंग करने के लिए तारों के भार में शामिल हो रहा हूं लेकिन अगर कोई शून्य है तो मुझे एक परम को अनदेखा करने की आवश्यकता है। वर्तमान में मैं यह नहीं सोच सकता कि अगर बयानों में अलग-अलग पैरामेट को अलग करने के अलावा इसे कैसे किया जाए। मदद कृपया:अगर var null C#

यहाँ कोड

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; 

सुनिश्चित नहीं हैं कि यह कैसे से निपटने के लिए।

+0

पूर्ण लिंक में बेसलिंक शामिल करना भूल गया। वास्तव में कोई फर्क नहीं पड़ता, लेकिन मैंने सोचा कि मैं इसे किसी और के सामने इंगित करता हूं। –

+3

किसी और चीज के अलावा, क्या आपको यकीन है कि आपको पैरामीटर को यूआरएल-एन्कोड करने की आवश्यकता नहीं है? और क्या आप वास्तव में * एक यूआरएल में पासवर्ड रखना चाहते हैं? –

+0

क्या आप 'सार्वजनिक शून्य नमूना (स्ट्रिंग कुंजी, स्ट्रिंग सेवा = शून्य)' के बारे में बात कर रहे हैं? – Greg

उत्तर

22

मैं वास्तव में यह इस तरह से refactor होगा:

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

संभवतः इसे 'पैरा' पैरामीटर बनाते हैं, इसलिए कॉलर को सरणी बनाने की भी आवश्यकता नहीं है ... –

+1

आसान उपयोग के लिए आप पैराम्स कीवर्ड सार्वजनिक शून्य लिंकबिल्डर (पैराम स्ट्रिंग [] लिंक) जोड़ सकते हैं (http: // stackoverflow.com/questions/7580277/why-use-the-params-keyword) – fuchs777

+0

ठीक है, मुझे लगता है कि यह विजेता है, लेकिन मैं पैराम कीवर्ड को विधि तर्कों में जोड़ दूंगा - सार्वजनिक शून्य लिंकबिल्डर (पैराम स्ट्रिंग [] लिंक) - ताकि उपयोगकर्ता इसे अल्पविराम से अलग कई स्ट्रिंग्स के साथ कॉल कर सके - लिंकबिल्डर (mybaselink, mysharedkey, myservice ...) - लेकिन विधि उन्हें स्ट्रिंग सरणी के रूप में स्वीकार करती है। – AgapwIesu

1

आप ऑपरेटर द्वारा तारों की जांच कर सकते हैं?: विधि में।

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

यह स्ट्रिंग में सभी '&' को जोड़ देगा हालांकि – LInsoDeTeh

+0

स्ट्रिंग का उपयोग करें। IsNullOrEmpty असाइनमेंट करने से पहले i.e: sharedKey = string.IsNullOrEmpty (sharedKey)? string.Empty: "&" + sharedKey –

+0

@LInsoDeTeh, धन्यवाद, तय किया गया। – dremerDT

1

अपने तार का एक गणनीय संग्रह बनाओ, Nulls को फ़िल्टर करने के LINQ का एक सा इस्तेमाल करते हैं, तो यह सब वापस एक साथ फिर से 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); 

ऑफ-मौके पर कि आप वास्तव में क्वेरीस्ट्रिंग को इकट्ठा करने की कोशिश कर रहे हैं, तो बेहतर तरीके हैं।

उदाहरण के लिए, आप निम्न विधि का उपयोग कर HttpUtility और प्रतिबिंब का लाभ उठाने सकता है एक क्वेरी स्ट्रिंग को एक गुमनाम वस्तु पार्स करने के लिए:

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(); 
    } 
} 

तो

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

आप दे देंगे:

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

यदि उद्देश्य प्रत्येक पैरामीटर को एक एसएपी में लपेटने से बचाना है tement, तो आप उन्हें एक सूची में जोड़ सकते हैं, तो String.Join उपयोग करें, और 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

नीचे एक Collection जो मैं बेहतर पोषणीय हो सकता है महसूस स्वीकार करेंगे। मैं थोड़ा सा कारखाना फिर से किया।

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

इस तरह आप अपने यूआरएल के निर्माण के लिए एक संग्रह से होकर गुजरेगा, तो यह आप के लिए विशाल यूआरएल return होगा। आपके पास भारी चयन है, मैं व्यक्तिगत रूप से मक्सिम के जवाब की तरह हूं।

संबंधित मुद्दे