【问题标题】:Linq query combine two or three expressionsLinq 查询结合两个或三个表达式
【发布时间】:2017-06-14 06:05:01
【问题描述】:

我使用以下查询从文本文件中获取 lineCount、布尔值和最后一行

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

在这里我正在读取文件三遍它会有点影响我们那里的性能任何可能将这三行组合成一个表达式和 希望对文件进行单次读取操作..

任何人都可以帮助我解决如何在上述情况中进行单一表达。

非常感谢提前..

【问题讨论】:

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


    【解决方案1】:

    也许我没有完全理解你的要求,但如果你担心的是性能,我建议如下:

    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

    【讨论】:

    • @EnigmaState 很高兴我能帮上忙。
    • 我无法在 fileReadInfo 上获取值 ...智能感知没有显示任何有关计数和剩余内容的信息 ..我如何使用 fileReadinfo ...您能告诉我
    • @EnigmaState 在那个特定的示例中,我使用Tuple&lt;int, bool, string&gt; 收集所有需要的数据,因此fileReadInfo 是IEnumerable&lt;Tuple&lt;int, bool, string&gt;&gt;。您可以执行foreach (var entry in fileReadInfo) 之类的操作,然后使用属性entry.Item1entry.Item2entry.Item3 访问收集的数据。有关如何使用元组的更多信息,您可以访问:msdn.microsoft.com/en-us/library/system.tuple(v=vs.110).aspx
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-23
        • 2013-03-21
        相关资源
        最近更新 更多