1

文字列のコレクションがあるとします。

List<string> lines = new List<string>(File.ReadAllLines("Test.txt"));

そして、そのコレクションで一致するものを検索するための正規表現:

Regex r = new Regex(@"some regular expression");

正規表現に一致する要素のインデックスを取得するにはどうすればよいですか?

私には3つのアイデアがあります。


1位:

var indeces1 = lines.Where(l => r.IsMatch(l))
                    .Select(l => lines.IndexOf(l));
foreach (int i in indeces1)
{
    Console.WriteLine(i);//Do the index-based task instead...
}

私が気に入らないのはIndexOf、元のコレクションを使用していることです。私は間違っていますか、それは大丈夫ですか?


var indeces2 = lines.Select((l, i) => new { Line = l, Index = i })
                    .Where(o => r.IsMatch(o.Line));

foreach (var o in indeces2)
{
    Console.WriteLine(o.Index);//Do the index-based task instead...
}

最初のものよりは良いようですが、匿名オブジェクトを作成せずに同じことを行う方法はありますか?


そして最後のもの:

for (int i = 0; i < lines.Count; i++)
{
    if (r.IsMatch(lines[i]))
    {
        Console.WriteLine(i);//Do the index-based task instead...
    }
}

実はこれが今動いています。しかし、私はLINQが大好きなので、同じことを行うLINQの方法が欲しかったのです。

では、この単純なタスクを実行するためのより良いLINQの方法はありますか?

4

3 に答える 3

2

LINQが好きな場合は、Enumerable.Rangeを使用して簡単にすることができます。

var indexes = Enumerable.Range(0, lines.Count)
                        .Where(i => r.IsMatch(lines[i]));

編集:

File.ReadAllLinesすべての行をメモリに取り込むために使用する代わりに:

List<string> lines = new List<string>(File.ReadAllLines("Test.txt"));

ファイルが大きい場合はReadLines、より効率的に実行を延期する方法を使用することを検討する必要があります。

var lines = File.ReadLines("C:\\Test.txt"));
于 2012-12-25T06:06:52.277 に答える
2

インデックスだけが必要な場合は、 .Select(t => t.Index); を試してみませんか。オプション2で(最後に)インデックスのみのIEnumerableを取得します。Anonymous オブジェクトを取り除きます。

したがって、クエリは次のようになります。

var indeces2 = lines.Select((l, i) => new { Line = l, Index = i })
        .Where(o => r.IsMatch(o.Line))
        .Select(t => t.Index);
于 2012-12-25T06:17:46.663 に答える
0

この場合、謙虚なイテレータ バージョンを使用します。

for (int i = 0; i < lines.Count; i++)
{
    if (r.IsMatch(lines[i]))
    {
        Console.WriteLine(i);//Do the index-based task instead...
    }
}

このシナリオでは、オプション 3 と比較して、LINQ は実際には行数を減らしたり読みやすさを向上させたりしません。したがって、この場合は最も単純なバージョンを使用します。

于 2012-12-25T06:19:09.363 に答える