2009-04-17 12 views
20

मुझे आश्चर्य है कि एक अधिभार नहीं है जो एक स्ट्रिंग सरणी ले सकता है। वैसे भी, Path.Combine पर घोंसले कॉल से बचने का सबसे अच्छा तरीका क्या है?पथ। कॉम्बाइन का उपयोग 2 से अधिक तर्कों के साथ कैसे किया जा सकता है?

pathValue = Path.Combine(path1, Path.Combine(path2, Path.Combine(path3, path4))) 

यह अक्षम लगता है, क्योंकि यह में 4 नए तार सिर्फ 1.

+5

.Net4 पथ में। संयोजन() को इस तरह दो से अधिक तारों को लेने के लिए बदला गया था: पथ। कॉम्बाइन (पथ 1, पथ 2, पथ 3, ...)। मिठाई! – fredw

+1

खैर, बकवास। माइक्रोसॉफ्ट के पास नेट 2.0 में लागू करने के लिए सामान्य ज्ञान नहीं था या 3.5 भी बिल्ली? – david

उत्तर

21

चीजों की दक्षता पक्ष समस्या IMO नहीं है पाने के लिए बनाया जा रहा परिणाम - यह चीजों के प्रयोज्य पहलू भी है। व्यक्तिगत रूप से मुझे लगता है कि वहाँ की एक अधिभार होना चाहिए:

Combine(string first, string second, string third, params string[] others) 

आप कम से कम यह मौजूदा दो पैरामीटर संस्करण के साथ संघर्ष से रोकने के लिए अगर आप सिर्फ Path.Combine("foo", "bar") लिखने लेकिन यह निश्चित रूप कोड बनाने के लिए मदद मिलेगी तीन की जरूरत है साफ। Connect पर फीचर अनुरोध क्यों नहीं खोलें?

बेशक

, तो आप इस अपने आप को लागू कर सकते हैं (और एक अन्य वर्ग में करता है इतना मामला नहीं पैरामीटर की संख्या):

public static string CombinePaths(string first, params string[] others) 
{ 
    // Put error checking in here :) 
    string path = first; 
    foreach (string section in others) 
    { 
     path = Path.Combine(path, section); 
    } 
    return path; 
} 
+5

डाउनवॉटर: कृपया एक कारण दें, अन्यथा आपका डाउनवोट व्यर्थ है। –

+6

ओपी की इच्छा दी गई है। Path.Combine (पैराम्स) के लिए समर्थन .net 4 बीटा 2 में जोड़ा गया है - http://blogs.msdn.com/bclteam/archive/2009/10/21/what-s-new-in-the-bcl-in -नेट -4-बीटा -2-जस्टिन-वैन-पैटन.स्पैक्स – Gishu

+1

रिशेर्पर घटना को अधिक संक्षिप्त दूसरों का सुझाव देता है। ऑग्रेगेट (पहला, पथ। कॉम्बाइन) – username

1

यह यह अपने आप को लागू करने के लिए बहुत सीधा है:

public string Combine(params string[] paths) 
{ 
    char[] pathSeparators = new char[] 
     { Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar, Path.VolumeSeparatorChar }; 

    if(paths == null) throw new ArgumentNullException("paths"); 
    if(paths.Length == 1) return paths[0]; 

    StringBuilder pathBuilder = new StringBuilder(); 

    foreach(string path in paths) 
    { 
     if(Path.IsPathRooted(path)) 
      pathBuilder = new StringBuilder(path); 
     else 
     { 
      char last = pathBuilder.Length > 0 ? 
       pathBuilder[pathBuilder.Length - 1] : 
       path[path.Length - 1]; 

      if(Array.IndexOf(pathSeparators, last) == -1) 
       pathBuilder.Append(Path.DirectorySeparatorChar); 

      pathBuilder.Append(path); 
     } // else 
    } // foreach 

    return pathBuilder.ToString(); 
} 

[Test()] 
public void CombinePaths() 
{ 
    string result = Combine(@"C:\Program Files\", @"Microsoft.NET", @"ADOMD.NET\", "90", "msadomdx.dll"); 
    Assert.AreEqual(@"C:\Program Files\Microsoft.NET\ADOMD.NET\90\msadomdx.dll", result); 
} 
25

आप पहले से ही एक सरणी या एक IEnumerable तो आप एक पंक्ति में ऐसा कर सकता है ... है, तो

// I'm assuming that you've got an array or IEnumerable<T> from somewhere 
var paths = new string[] { path1, path2, path3, path4, path5, path6 }; 

string result = paths.Aggregate(Path.Combine); 

यदि नहीं, तो कैसे स्ट्रिंग के लिए अपने स्वयं के एक्सटेंशन विधि लेखन ...

public static class PathExtension 
{ 
    public static string CombinePathWith(this string path1, string path2) 
    { 
     return Path.Combine(path1, path2); 
    } 
} 

के बारे में ... कि इस तरह श्रृंखला इन करने के लिए आप की अनुमति होगी ...

string result = path1.CombinePathWith(path2) 
        .CombinePathWith(path3) 
        .CombinePathWith(path4) 
        .CombinePathWith(path5) 
        .CombinePathWith(path6); 
+3

कूल, मुझे संख्यात्मक.एग्रेगेट के बारे में पता नहीं था! –

+0

@ क्रिस्टियन। कुल मिलाकर एक बहुत शक्तिशाली उपकरण है। –

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

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