LINQ迭代结果

时间:2012-06-07 18:46:23

标签: linq

我正在尝试阅读以下文本文件:

    Author
    {
    Name  xyz
    blog  www.test.com
    rating 123
    }    
   Author
    {
    Name  xyz
    blog  www.test.com
    rating 123
    }   
    Author
    {
    Name  xyz
    blog  www.test.com
    rating 123
    }   
    Author
    {
    Name  xyz
    blog  www.test.com
    rating 123
    }

我正在使用以下代码段来获取我的作者记录:

  public static IEnumerable<string> GetAuthors(string path, string startfrom, string endto)
        {
            return File.ReadLines(path)
                .SkipWhile(line => line != startfrom)
                .TakeWhile(line => line != endto);
        }



 public static void DoSomethingWithAuthors(string fileName)
        {
            var result = GetAuthors(fileName, "AUTHOR", "}").ToList();
         }

以上只返回一个作者详细信息。有人可以告诉我如何一次性获取所有作者,以便我可以弹出一个对象。非常感谢你!!

2 个答案:

答案 0 :(得分:0)

它将在它遇到的第一个}处停止。

删除.TakeWhile(line => line != endto)位,它应该适合你。

答案 1 :(得分:0)

我很少建议,但如果文件结构是可预测的,您甚至可以使用正则表达式来获取作者的详细信息。由于要初始化的对象不复杂,因此可以匹配Author位并从正则表达式匹配组中获取值。

匹配作者的正则表达式将是这样的:

Author\s*{\s*Name\s+(.*?)\s+blog\s+(.*?)\s+rating\s+(.*?)\s*}

您的值将在1,2和3组中。

修改

如果它对您没有影响,您可以使用ReadToEnd()方法,然后您可以将整个文件内容解析为字符串:
http://msdn.microsoft.com/en-us/library/system.io.streamreader.readtoend(v=vs.100).aspx

至于正则表达式解决方案 - 请检查一下:
http://msdn.microsoft.com/en-us/library/twcw2f1c.aspx

一个改编的版本 - 可能需要调整,但一般来说它应该有效:

string text = [yourInputFileAsString]
      string pat = @"Author\s*{\s*Name\s+(.*?)\s+blog\s+(.*?)\s+rating\s+(.*?)\s*}";

      Regex r = new Regex(pat, RegexOptions.IgnoreCase | RegexOptions.Singleline);

      Match m = r.Match(text);

      var authors = new List<Author>();
      while (m.Success) 
      {
         var name = m.Groups[1].Value;
         var blog = m.Groups[2].Value;
         var rating = m.Groups[3].Value;
         var author = new Author(name, blog, rating);
         authors.Add(author);

         m = m.NextMatch();
      }