我希望将string
或List<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#中执行此操作?
答案 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() ;