当前一行包含字符串时查找所有下一行

时间:2015-01-09 18:01:09

标签: c# readline

我正在开发一个ASP mvc应用程序,并且当前一行包含一个单词时,我试图获取所有下一行

我已经使用了下面的代码,但我可以获得包含给定单词的最后一行

int counter = 0;
string line;
List<string> found = new List<string>();
// Read the file and display it line by line.
System.IO.StreamReader file = new System.IO.StreamReader("C:\\Users\\Chaimaa\\Documents\\path.txt");
while ((line = file.ReadLine()) != null)
{
    if (line.Contains("fact"))
    {
        found.Add(line);
    }
    foreach (var i in found)
    {
        var output = i;
        ViewBag.highlightedText = output;
    }
}

有关我应该添加的内容的任何帮助 1-获取包含该单词的所有行 2-并且最好得到所有NEXT行

2 个答案:

答案 0 :(得分:1)

您可以使用提供索引的Where重载,在哈希集中存储索引,并使用包含检查来决定是否应该保留一行,如下所示:

var seen = new HashSet<int>();
var res = data.Where((v, i) => {
    if (v.Contains("fact")) {
        seen.Add(i);
    }
    return seen.Contains(i-1);
});

Demo.

作为附带好处,seen将包含已找到单词"fact"的所有行的索引。

答案 1 :(得分:0)

您可以编写一个PairWise方法,该方法接受一系列值并返回一个序列,其中包含与之前项目配对的每个项目:

public static IEnumerable<Tuple<T, T>> Pairwise<T>(this IEnumerable<T> source)
{
    using (var iterator = source.GetEnumerator())
    {
        if (!iterator.MoveNext())
            yield break;

        T prev = iterator.Current;

        while (iterator.MoveNext())
        {
            yield return Tuple.Create(prev, iterator.Current);
            prev = iterator.Current;
        }
    }
}

使用这种方法,我们可以配对每一行,得到前一个值包含一个单词的行,然后计算出第二个值,即后面的行:

var query = lines.Pairwise()
    .Where(pair => pair.Item1.Contains(word))
    .Select(pair => pair.Item2);