2011-07-20 23 views
6

मैं सी # में एक विधि डीबग करने की कोशिश कर रहा हूं लेकिन यहां मेरे मूल वाक्यविन्यास कौशल की कमी है! विधि को अल्पविराम से अलग टेक्स्ट स्ट्रिंग के रूप में दिनांकों की एक सूची स्वीकार करता है। यह स्ट्रिंग एक सूची में परिवर्तित हो जाती है, फिर संसाधित की जाती है। हालांकि, ऐसा लगता है कि जब भी एक खाली स्ट्रिंग विधि को पास की जाती है, तब भी जब सूची गिना जाता है तब भी यह 1 आउटपुट होता है।सी # सूची गणना हमेशा खाली होती है जब सूची खाली होती है

कोड इस प्रकार है:

public static int DaysLeft(DateTime endDate, DateTime startDate, Boolean excludeWeekends, String excludeDates) 
    { 
     int counter = 0; 

     List<string> excludeDatesList = new List<string>(excludeDates.Split(',')); 

     counter = excludeDatesList.Count; 

     return counter; 
    } 

अगर मैं excludeDates पैरामीटर के रूप में एक खाली स्ट्रिंग पारित, यह रिटर्न 1. अगर मैं दो तिथियों पार कर लेते हैं मैं एक ही तारीख में यह रिटर्न 1. गुजरती हैं, यह रिटर्न 2 इत्यादि। इसलिए यह काम करने की तरह है, जहां कुछ भी पास नहीं हुआ है, जब मैं इसे वापस लौटने की उम्मीद करता हूं लेकिन यह वास्तव में वापस आता है।

क्या कोई मुझे सही दिशा में इंगित कर सकता है?

धन्यवाद

यहां तक ​​कि एक खाली स्ट्रिंग के लिए

उत्तर

10

, Splitकि सरणी में स्ट्रिंग, तो सूची के साथ ... एक खाली स्ट्रिंग बनाया जाएगा, उत्पादन एक 1. की .Count [संपादित वापस आ जाएगी : आप excludeDates.Split(',', StringSplitOption.RemoveEmptyEntries) तो कॉल कर सकते हैं कि यदि ऐसा नहीं होता]

आपकी अपेक्षा के अनुरूप व्यवहार अपने कार्य बनाने के लिए, आप शायद प्रत्येक "तिथि" स्ट्रिंग Split() से लौटे पार्स करने के लिए प्रयास करना चाहिए, और केवल मान्य दिनांक के लिए काउंटर बढ़ाने के।।

कुछ इस तरह:

int counter = 0; 
    var possibleDates = excludeDates.Split(','); 

    foreach (var dateStr in possibleDates) 
    { 
     // Right now it just counts "good" dates, though could also do something 
     // with each date as well 
     DateTime dt; 
     if (DateTime.TryParse(dateStr, out dt)) 
      counter++; 
    } 

    return counter; 

आप सरल तरीका ढूंढ रहे हैं, तो आप बस पैरामीटर की जाँच करनी चाहिए अगर यह रिक्त स्ट्रिंग है देखने के लिए, और उस मामले में 0 वापसी:

if (string.IsNullOrEmpty(excludeDates)) 
    return 0; 
+0

आह, ठीक है, धन्यवाद। मुझे केवल कुछ तर्कों को संसाधित करने की आवश्यकता है यदि वहां कोई तिथि है, तो शायद मुझे इसकी जांच करने के लिए किसी अन्य विधि का उपयोग करने की आवश्यकता है। मुझे क्या उपयोग करना चाहिए? – Dan

+0

@Dan मेरे उत्तर के अपडेट देखें। विभाजन को कॉल करने से पहले बस खाली स्ट्रिंग की जांच करना सबसे आसान है। – dlev

+0

एक 'स्ट्रिंग। लक्षण' चेक बहुत बेहतर होगा – naveen

1

यह सामान्य व्यवहार है। जब इसे विभाजित करने के लिए कुछ भी नहीं होता है तो यह स्ट्रिंग के साथ एक सूची को पहले तत्व के रूप में वापस कर देगा जो एक के रूप में गिना जाता है।

1

स्ट्रिंग.Split() द्वारा लौटाई गई सरणी में हमेशा एक तत्व होता है, भले ही यह खाली स्ट्रिंग है।

1

सूची में एक खाली स्ट्रिंग डालने से एक तत्व की एक सूची तैयार होगी। वह तत्व आपकी खाली स्ट्रिंग होगी।

3

आप रिक्त प्रविष्टियों को हटाएं विकल्प का उपयोग कर सकते हैं।

var blah = ""; 

var split = blah.Split(new[]{';'}, StringSplitOptions.RemoveEmptyEntries); 
var split2 = blah.Split(new[]{';'}); 

// Returns zero 
Console.WriteLine(split.Length); 

// Returns one 
Console.WriteLine(split2.Length); 
8

चरित्र पर विभाजन एक खाली तत्व लौटा रहा है।

इसके बजाय excludeDates.Split(',', StringSplitOptions.RemoveEmptyEntries) का उपयोग करने का प्रयास करें।

1

एक स्ट्रिंग पर string.Split पर कॉल करने का परिणाम जिसमें डिलीमीटर (इस मामले में, अल्पविराम) नहीं है, एक सरणी है जिसमें मूल तत्व है। स्ट्रिंग खाली होने पर यह भी होता है।

समाधान खाली प्रविष्टियों छोड़ Split निर्दिष्ट करने के लिए है:

List<string> excluseDatesList = new List<string>(excludeDates.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries)); 
+0

स्ट्रिंग में पारित तिथियों की संख्या के बावजूद यह 0 वापस लौटता प्रतीत होता है। – Dan

0

dlev के रूप में कहा ..लेकिन वर्णन करने के लिए, यदि आप स्ट्रिंग "," में पारित एक उदाहरण जोड़ने के लिए - जो सिर्फ एक अल्पविराम है, तो ",".Split(',').Count()",,,," के लिए 2. वापस आ जाएगी जो सिर्फ चार अल्पविराम का है, तो आप वापस गिनती के लिए मिल जाएगा 5 ...

int num = this.MakeSeparatorList(separator, ref sepList); 
if (num == 0 || count == 1) 
{ 
    return new string[] 
    { 
     this 
    }; 
} 

इसलिए, भले ही स्ट्रिंग स्ट्रिंग खाली है यह एक आइटम सरणी में वापस आ जाएगी:

0

यदि आप स्प्लिट विधि को देखो, यह निम्न तर्क है।

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