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

本文关键字:一行 查找 字符串 包含 | 更新日期: 2023-09-27 18:36:53

我正在开发一个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- 最好得到所有下一行

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

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

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

演示。

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

您可以编写一个 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);