2014-09-23 24 views
6

我想通過stringList<string>作爲參數,就像我可以在JavaScript中做的那樣,然後評估它是什麼類型並執行適當的操作。現在,我可以做這樣的:動態字符串的最佳做法/列表<string>參數

public static class TestParser 
{ 

    static void Parse(string inputFile) 
    { 
     // Lots of code goes in here 
    } 

    static void Parse(List<string> inputFileList) 
    { 
     // Lots of code goes in here too 
    } 
} 

什麼這些方法中的代碼做,基本上是一些程序或者一個文件或文件列表,解析取決於給出什麼類型。

如果我將有很多的代碼,我應該複製它,或者我應該創建其中將包含代碼的子方法,或者是有另一種很酷的方式我可以在C#這樣做嗎?

+0

你應該提取普通代碼分開,' private()方法,並從'Parse'中調用它。代碼重複從來都不是好事。 – MarcinJuraszek 2014-09-23 16:31:54

+0

我們沒有足夠的上下文。這種方法在做什麼?你能以某種方式從一種方法委託給另一種方法嗎? – 2014-09-23 16:32:22

+1

如果基本功能與List方法在字符串方法中基本相同,並且所有不同之處在於您在List方法中循環/迭代,那麼我只需將基本功能放在String方法中並使List方法調用字符串方法。這樣它就在一個地方,你的重載只是處理你想要做的額外解析事情。 – scrappedcola 2014-09-23 16:34:07

回答

11

根據什麼解析()是應該做的,合理的模式可能是

static void Parse(string inputFile) 
{ 
    // Lots of code goes in here 
} 

static void Parse(List<string> inputFileList) 
{ 
    foreach (var inputFile in inputFileList) 
     Parse(inputFile); 
} 

UPDATE

替代已建議建立一個new List<string>() { inputFile}並調用Parse(List<string>),而不是分離的將處理代碼轉換爲單獨的方法。

static void Parse(List<string> inputFileList) 
{ 
    // Lots of code goes in here too 
} 

static void Parse(string inputFile) 
{ 
    Parse(new List<string>() { inputFile }); 
} 

在幾乎所有情況下,這只是一個風格問題。我更喜歡我的解決方案,因爲它乍一看對我來說更清楚(至少對我來說)發生了什麼事情,還因爲我曾經在CLR處理短期對象成爲性能問題的能力很高的系統上工作。甚至99.99%的性能關鍵應用程序不會遇到這個問題。

任何性能差異將只有當你有,你正在推動CLR的CG的突破點單獨調用如此高的容積明顯。如果您對該方法的調用數量甚至較高,// Lots of code goes in here的處理時間很可能使創建新列表的性能成本幾乎無法衡量。

對於幾乎所有情況下,這兩種方法只是在風格不同,都是合適的。

+0

+1。我7秒太晚了:)。考慮儘管OP的風格,將參數的名稱更改爲lowerCase。 – 2014-09-23 16:35:41

+0

爲什麼你會有三個函數,而不是從'Parse(List )'調用'Parse(string)'? – 2014-09-23 16:36:53

+0

@PeterSchneider:儘管在現實生活中很少有情況會發生,但我並不喜歡創建其他不必要的對象。我曾在那些實際上非常重要的系統上工作。 – 2014-09-23 16:37:51

3

寫你的解析方法,你會

然後從循環方法

public static class TestParser 
{ 

    static void Parse(string InputFile) 
    { 
     // Lots of code goes in here 
    } 

    static void Parse(List<string> InputFileList) 
    { 
     foreach(string path in InputFileList) 
     { 
      Parse(path); 
     } 
    } 
} 
2

List<T>稱呼它,在內部,不是一個列表(在CS感)。這是一個根據需要重新分配的數組。假設芯解析邏輯是不管該方法是否通過1,2或更多的串相同的,我會做這樣的事情,在實施的邏輯來處理一個單一的項目:

static void Parse(string s) 
{ 
    // core logic for processing an individual item 
} 

然後加入合適的過載。我會首先加入通用版本:

static void Parse(params string[] list) 
{ 
    Parse((IEnumerable<string> list) ; 
} 

static void Parse(IEnumerable<T> list) 
{ 
    foreach(string s in list) 
    { 
    Parse(s) ; 
    } 
    return ; 
} 

第一個版本以上(params string[]),您可以調用該方法以可變的參數個數:

Parse("foo" , "bar") ; 
Parse("foo" , "bar" , "baz" , "bat") ; 

第二個版本以上(IEnumerable<T>)接受任何實現IEnumerable<T>:幾乎所有的標準收取,所以它會接受之類的東西:

List<string> listOfStrings = PopulateList() ; 
Parse(listOfStrings) ; 

string[] arrayOfStrings = listOfStrings().ToArray() ; 
Parse(arrayOfStrings) ; 

不是T Ø提之類的東西HashSet<string>TreeSet<string>

你甚至可以使用LINQ的延遲執行這個過載:

public static IEnumerable<string> ReadStringsFromFile(string fileName) 
{ 
    using (StreamReader reader = File.OpenText(fn)) 
    { 
    string s ; 
    while (null != (s=reader.ReadLine())) 
    { 
     yield return s ; 
    } 
    } 
} 

... 

Parse(ReadStringsFromFile()) ; 

將鏈中的方法一起使用:該文件將在同一時間內讀取一行,並每條線分別處理。

你也可以寫一個擴展方法讓您鏈中的方法調用起來:

public static void ParseEach(this IEnumerable<T> string strings) 
{ 
    foreach (string s in strings) 
    { 
    Parse(s) ; 
    } 
} 

,它可以讓你這樣說

ReadStringsFromFile().ParseEach() ; 
相關問題