2017-06-14 62 views
2

我从与下面的文本文件中获取lineCount,布尔值和lastLine所查询Linq查询将两个或三个表达式

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

我在这里读文件三次会有点打我们的表现有任何可能将这三条线结合成单一表达式和 寻找使文件单读取行动。

任何人都可以帮助我如何使上述之间的单一表达。

许多在此先感谢..

回答

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

+0

@EnigmaState高兴能帮上忙。 –

+0

我无法得到fileReadInfo的值... intellisense没有显示任何有关计数和剩余的东西..我怎样才能使用fileReadinfo ...可以告诉 –

+0

@EnigmaState在那个特殊的例子中我使用了'Tuple < int,bool,string>'来收集所有需要的数据,所以fileReadInfo是一个'IEnumerable >'。你可以像'foreach(var entry in fileReadInfo)'那样做,然后用属性entry.Item1',entry.Item2'和'entry.Item3'访问收集到的数据。有关如何使用元组的更多信息,请访问:https://msdn.microsoft.com/en-us/library/system.tuple(v=vs.110).aspx –

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