簡體   English   中英

動態字符串/列表的最佳實踐 <string> 參數

[英]Best practice with dynamic string/List<string> parameters

我想傳遞stringList<string>作為參數,就像我在JavaScript中可以做的那樣,然后評估它的類型並執行適當的操作。 現在我可以這樣做:

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
    }
}

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

如果我有很多代碼,我應該復制它,還是應該創建包含代碼的sub方法,還是有另一種很酷的方式我可以在c#中執行此操作?

取決於Parse()應該做什么,合理的模式可能是

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的處理時間// Lots of code goes in here可能會使創建新列表的性能成本幾乎無法估量。

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

像你一樣寫你的解析方法

然后從循環方法中調用它

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);
        }
    }
}

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 ) ;

更不用說像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() ;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM