वास्तव में, अपने कोड जो कुछ मौलिक बहुत कार्यात्मक है, अर्थात् यह सूची आइटम श्रृंखलाबद्ध द्वारा एक एकल स्ट्रिंग के लिए स्ट्रिंग की एक सूची को कम कर देता है। कोड के बारे में एकमात्र अनिवार्य बात StringBuilder
का उपयोग है।
कार्यात्मक कोड यह बहुत आसान बनाता है, वास्तव में, क्योंकि इसे आपके कोड जैसे विशेष मामले की आवश्यकता नहीं होती है। अभी भी बेहतर है, .NET पहले से ही है इस विशेष कार्रवाई लागू है, और शायद अपने कोड 1) तुलना में अधिक कुशल:
return String.Join(", ", ListOfResources.Select(s => s.Id.ToString()).ToArray());
(हाँ, ToArray()
करने के लिए कॉल से परेशान है, लेकिन Join
एक बहुत पुरानी विधि है और । LINQ)
बेशक
, Join
की एक "बेहतर" संस्करण इस तरह इस्तेमाल किया जा सकता से पहले:
return ListOfResources.Select(s => s.Id).Join(", ");
कार्यान्वयन अपेक्षाकृत सरल है - लेकिन एक बार फिर, StringBuilder
(प्रदर्शन के लिए) का उपयोग करना अनिवार्य बनाता है।
public static String Join<T>(this IEnumerable<T> items, String delimiter) {
if (items == null)
throw new ArgumentNullException("items");
if (delimiter == null)
throw new ArgumentNullException("delimiter");
var strings = items.Select(item => item.ToString()).ToList();
if (strings.Count == 0)
return string.Empty;
int length = strings.Sum(str => str.Length) +
delimiter.Length * (strings.Count - 1);
var result = new StringBuilder(length);
bool first = true;
foreach (string str in strings) {
if (first)
first = false;
else
result.Append(delimiter);
result.Append(str);
}
return result.ToString();
}
1) परावर्तक में कार्यान्वयन को देखा बिना, मुझे लगता है चाहते हैं कि String.Join
तार पर एक पहले पास कुल लंबाई निर्धारित करने के लिए बनाता है। इसका उपयोग StringBuilder
तदनुसार प्रारंभ करने के लिए किया जा सकता है, इस प्रकार बाद में महंगा प्रति संचालन को बचाया जा सकता है।
संपादित SLaks द्वारा: यहाँ नेट 3.5 से String.Join
के संबंधित भाग के लिए संदर्भ स्रोत है:
string jointString = FastAllocateString(jointLength);
fixed (char * pointerToJointString = &jointString.m_firstChar) {
UnSafeCharBuffer charBuffer = new UnSafeCharBuffer(pointerToJointString, jointLength);
// Append the first string first and then append each following string prefixed by the separator.
charBuffer.AppendString(value[startIndex]);
for (int stringToJoinIndex = startIndex + 1; stringToJoinIndex <= endIndex; stringToJoinIndex++) {
charBuffer.AppendString(separator);
charBuffer.AppendString(value[stringToJoinIndex]);
}
BCLDebug.Assert(*(pointerToJointString + charBuffer.Length) == '\0', "String must be null-terminated!");
}
सबकुछ एक नाखून नहीं है ... – AwkwardCoder
@Eric: क्या आप गैर-दुष्प्रभाव-उत्पन्न कोड निष्पादित करने के लिए ForEach एक्सटेंशन विधि का उपयोग करने में कुछ भी गलत देखते हैं उदा। क्वेरी से प्रत्येक परिणाम पर एक WriteLn कर रहे हैं? –
@ टॉम: मैं यहां आपकी विचार की ट्रेन का पालन नहीं कर रहा हूं। निश्चित रूप से एक लाइन लिखना एक दुष्प्रभाव है, नहीं? –