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)
我在这里使用作文.例如,对于第一个,首先将位读取线分开 - 并使其变得懒惰......
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方法中.
| 归档时间: |
|
| 查看次数: |
209 次 |
| 最近记录: |