如何重构这些函数以促进代码重用?

JMP*_*JMP 2 c# optimization delegates

几个星期前我写了这些辅助函数,我觉得我没有利用一些C#语言功能,这些功能会让我不再为其他类似的助手编写这些相同的循环.

任何人都可以建议我缺少什么?

public static IList<string> GetListOfLinesThatContainTextFromList(
        Stream aTextStream, IList<string> aListOfStringsToFind)
{
    IList<string> aList = new List<string>();

    using (var aReader = new StreamReader(aTextStream))
    {
        while (!aReader.EndOfStream)
        {
            var currLine = aReader.ReadLine();

            foreach (var aToken in aListOfStringsToFind)
                if (currLine.Contains(aToken))
                    aList.Add(currLine);
        }
    }

    return aList;
}

public static DataTable GetDataTableFromDelimitedTextFile(
        Stream aTextStream, string aDelimiter)
{
    var aTable = new DataTable();
    Regex aRegEx = new Regex(aDelimiter);

    using (var aReader = new StreamReader(aTextStream))
    {
        while (!aReader.EndOfStream)
        {
            // -snip-
            // build a DataTable based on the textstream infos
        }
    }

    return aTable;
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 6

我在这里使用作文.例如,对于第一个,首先将位读取线分开 - 并使其变得懒惰......

public static IEnumerable<string> ReadLines(Stream input)
{
    // Note: don't close the StreamReader - we don't own the stream!
    StreamReader reader = new StreamReader(input);
    string line;
    while ((line = reader.ReadLine()) != null)
    {
        yield return line;
    }
}
Run Code Online (Sandbox Code Playgroud)

(您可以在MiscUtil中找到功能更全面的版本.)

现在你可以使用LINQ来过滤不在适当集合中的行(我使用HashSet而不是列表,除非它是一个非常简短的列表):

var acceptedLines = new HashSet<string>();
// Populate acceptedLines here
var query = ReadLines(input).Where(line => acceptedLines.Contains(line))
                            .ToList();
Run Code Online (Sandbox Code Playgroud)

填充DataTable时,可以使用相同的行读取方法.你需要小心 - 这是懒惰的评估,所以你需要保持流打开,直到你完成阅读,然后自己关闭它.我更喜欢传递一些东西,让你得到一个Stream(或一个TextReader),因为结束逻辑可以在ReadLines方法中.