2017-06-14 66 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); 
}