Linq查询结合了两个或三个表达式

时间:2017-06-14 06:05:02

标签: c# .net linq c#-4.0 lambda

我从文本文件中获取lineCount,boolean value和lastline以及以下查询

 private void ReadFile(FileInfo[] TXTFiles, out int totalLineCount, out bool result, out string footerContent)
 {
     totalLineCount = File.ReadLines(TXTFiles[0].FullName).Count();
     result = File.ReadLines(TXTFiles[0].FullName).Last().StartsWith(fileFooterIdentify);
     footerContent = File.ReadLines(TXTFiles[0].FullName).Last();
 }

这里我正在阅读文件三次它会对我们的性能有点影响我们有可能将这三行合并为单个表达式 希望对文件进行单一读取操作..

任何人都可以帮我解决这个问题,如何在上面进行单一表达。

非常感谢提前..

3 个答案:

答案 0 :(得分:5)

也许我并不完全理解你的要求,但如果这是你担心的表现,我建议如下:

private void ReadFile(FileInfo[] TXTFiles, out int totalLineCount, out bool result, out string footerContent)
 {
     var fileContents = File.ReadLines(TXTFiles[0].FullName);
     totalLineCount = fileContents.Count();
     result = fileContents.Last().StartsWith(fileFooterIdentify);
     footerContent = fileContents.Last();
 }

据我所知,将其转换为单个表达式既不会改善您的表现,也不会使其更具可读性。

修改 如果您正在寻找迭代FileInfo数组上的方法,我可以建议以下表达式:

var fileReadInfo = TXTFiles.Select(file =>
{
    var fileContents = File.ReadAllLines(file.FullName);
    return new Tuple<int, bool, string>(fileContents.Count(),
        fileContents.Last().StartsWith(fileFooterIdentify), fileContents.Last());
});

虽然我建议您创建一些类来存储有关文件的所有信息,而不是使用Tuple

答案 1 :(得分:0)

只需将读取的文件结果保存为数组:

private void ReadFile(FileInfo[] TXTFiles, out int totalLineCount, out bool result, out string footerContent)
 {
     string[] lines = File.ReadLines(TXTFiles[0].FullName);
     totalLineCount = lines.Count();
     result = lines.Last().StartsWith(fileFooterIdentify);
     footerContent = lines.Last();
 }

答案 2 :(得分:0)

File.ReadLines的结果存储到本地变量中并使用该变量

private void ReadFile(FileInfo[] TXTFiles, out int totalLineCount, out bool result, out string footerContent)
 {
     var content = File.ReadLines(TXTFiles[0].FullName);
     totalLineCount = content.Count();
     footerContent = content.Last();
     result = footerContent.StartsWith(fileFooterIdentify);
 }

那将只读取文件两次。

只有一个读取操作更改为

private void ReadFile(FileInfo[] TXTFiles, out int totalLineCount, out bool result, out string footerContent)
{
    var content = File.ReadLines( TXTFiles[0].FullName );
    totalLineCount = 0;
    foreach ( var row in content )
    {
        totalLineCount++;
        footerContent = row;
    }
    result = footerContent.StartsWith( fileFooterIdentify );
}