0

私はそれが正常に動作する次のコードを持っています:

string[] userSelect = new string[] {"the", "sled", "had", "not", "moved", ";", "the", "driver", "was", "surprised", "."};
string[] original = new string[] {"the", "driver", "was", "surprised", ",", "too", ";", "the", "sled", "had", "not", "moved", "."};

var matches = 
    (from l in userSelect.Select((s, i) => new { s, i })
     join r in original.Select((s, i) => new { s, i }) 
     on l.s equals r.s 
     group l by r.i - l.i into g
     from m in g.Select((l, j) => new { l.i, j = l.i - j, k = g.Key })
     group m by new { m.j, m.k } into h
     select h.Select(t => t.i).ToArray())
    .ToArray();

// remove filter overlaps
int take = 0;
var filtered = matches.Where(m => !matches.Take(take++)
    .Any(n => m.All(i => n.Contains(i))))
    .ToArray();

上記を使用すると、次の結果が得られます。

{{0,1,2,3,4}, {6,7,8,9}, {5,6}, {10}}

6 の重複に注意してください。{"the", "driver", "was", "surprised"} と {";", "the"} はどちらも元の文にあるためです。

このような場合には、二次フィルターが必要です。このようなすべての値の重複を見つけて、それらを独立した配列に抽出して、インデックス値の重複がないようにする必要があります。出力はオーバーラップを分離して、次のようになります。

{{0,1,2,3,4}, {7,8,9}, {10}, {6}, {5}}
4

0 に答える 0