gpt4 book ai didi

c# - 我如何重构这些函数以促进代码重用?

转载 作者:行者123 更新时间:2023-11-30 20:13:47 25 4
gpt4 key购买 nike

几周前我编写了这些辅助函数,但我觉得我没有利用某些 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;
}

最佳答案

我会在这里使用组合。例如,对于第一个,首先拆分出位读取行 - 并使其惰性...

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

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

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

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

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

关于c# - 我如何重构这些函数以促进代码重用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1289108/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com