2009-09-03 10 views
6

लॉगिंग उद्देश्यों के लिए, मैं ऑब्जेक्ट [] सरणी पर प्रत्येक ऑब्जेक्ट की .ToString() विधि को कॉल करना चाहता हूं। मैं इसे सबसे सरल तरीके से कैसे कर सकता हूं?सी # IEnumerable <Object> स्ट्रिंग

मेरे पास है कहते हैं:,

"astring".ToString()+1.ToString()+Customer.ToString() 

या बेहतर प्रत्येक मान के बीच अल्पविराम के साथ:

myArray = new Object[]{"astring",1, Customer} 

    Log(????); 

मैं कैसे इस तरह के अपने मूल्य के रूप में एक स्ट्रिंग पारित कर सकते हैं के बराबर है।

+1

शिकार: http://stackoverflow.com/questions/380708/सबसे छोटा-विधि-टू-कन्वर्ट-ए-एरे-टू-ए-स्ट्रिंग-इन-सी-लिनक –

+0

और वास्तव में http://stackoverflow.com/questions/145856 –

उत्तर

19
इस तरह

:

Log(String.Join(", ", myArray.Select(o => o.ToString()).ToArray())); 

अद्यतन:

Log(String.Join(", ", myArray.Select(o => o.ToString()))); 
+0

स्ट्रिंग पूंजी स्ट्रिंग होना चाहिए। यह और है .... –

+1

@ जोनाथन: सही। मैं हमेशा इसे इस तरह लिखता हूं, इसलिए मुझे नहीं पता कि मैंने इस बार क्यों नहीं किया ... – Guffa

+1

जोनाथन, और क्या? यदि आप 'स्ट्रिंग' का उपयोग करने के लिए थे, तो उपनामों के साथ सी # जहाज क्यों था? –

2
:

ढांचे 4 से तो आप ToArray की जरूरत नहीं है Join विधि भी एक IEnumerable<string> ले जा सकते हैं,

मैं नियमित रूप से उपयोग करता हूं ...

String.Join(", ", Array.ConvertAll<object, string>(myArray, Convert.ToString)) 
2

MoreLINQ इस उद्देश्य के लिए ToDelimitedString विधि है।

String.Join का उपयोग करने के बजाय यह StringBuilder का उपयोग करता है (जो मुझे पिछले प्रश्नों से याद है, दो दृष्टिकोणों की दक्षता इनपुट पर निर्भर करती है) लेकिन यह काफी आसान है। यहाँ कोर कोड है (वहाँ रैपर के एक जोड़े के लिए एक डिफ़ॉल्ट सीमांकक अनुमति देने के लिए कर रहे हैं):

private static string ToDelimitedStringImpl<TSource> 
    (IEnumerable<TSource> source, string delimiter) 
{ 
    Debug.Assert(source != null); 
    Debug.Assert(delimiter != null); 

    var sb = new StringBuilder(); 

    foreach (var value in source) 
    { 
     if (sb.Length > 0) sb.Append(delimiter); 
     sb.Append(value); 
    } 

    return sb.ToString(); 
} 
+0

प्रत्येक पुनरावृत्ति पर sb.Length की जांच करने की आवश्यकता नहीं है। आप sb.ToString (1, sb.Length-1) को लौटकर पहला डिलीमीटर हटा सकते हैं। – gimel

+0

@gimel: लंबे डिलीमीटर और खाली स्रोतों का विवरण लेने के लिए, इससे थोड़ा अधिक जटिल है। हालांकि बेहतर तरीके हैं ... मैं यहां ब्रेसिज़ की कमी पर भी उत्सुक नहीं हूं। समय मिलने पर ठीक हो जाएगा :) –

1

एक साधारण वर्ष फैशन रास्ता:

string myString = ""; 
foreach(Object o in myArray) 
    myString += o.ToString() + ", "; 
// Remove the extra comma 
if(myString.Length >=2) 
    myString.Remove(myString.Length - 2); 
संबंधित मुद्दे