动态字符串/ List <string>参数的最佳实践</string>

时间:2014-09-23 16:30:26

标签: c# class interface

我希望将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
    }
}

这些方法中的代码基本上是用一些文件或文件列表解析一些程序,取决于给出的类型。

如果我有很多代码,我应该复制它,还是应该创建包含代码的子方法,还是有另一种很酷的方式我可以在c#中执行此操作?

3 个答案:

答案 0 :(得分:11)

具体取决于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);
}

<强>更新

已建议替代方法创建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的处理时间可能会使创建新列表的性能成本几乎无法估量。

对于几乎所有情况,这两种方法仅在风格上有所不同,并且都是合适的。

答案 1 :(得分: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 :(得分: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 ) ;

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