2

私はリストを持っています:

var myList = new List<string> { "red", "blue", "green" };

私は文字列を持っています:

var myString = "Alfred has a red and blue tie";

myList内の単語の一致数を取得しようとしていますmyString。現在、.Contains()「アルフレッド」の「赤」を拾っているので、3カウントを使用しています。代わりに単語を分離できるようにする必要があります。これはどのように達成できますか?

var count = myList.Where(ml => myString.Contains(ml)); // gets 3, want 2
4

4 に答える 4

4
        var myList = new List<string> { "red", "blue", "green" };
        Regex r = new Regex("\\b(" + string.Join("|", myList.ToArray()) + ")\\b");
        MatchCollection m = r.Matches("Alfred has a red and blue tie");

m.Countは、赤、青、または緑が見つかった回数を示します。\bは単語の境界を指定します。

mの各要素はタイプマッチであり、各インデックスを調べて詳細情報を取得できます(つまり、m [0] .Valueは一致した文字列(赤)を示し、m[0].Indexは元の位置を示します文字列(13))。

于 2010-10-20T19:14:03.847 に答える
1
var count = (from s in myList
            join ms in myString.Split() on s equals ms
            select new { s, ms }).Count();
于 2010-10-20T19:09:41.390 に答える
1

このようなもの?

var numMatches = myString.Split().Intersect(myList).Count();

これは重複した発生を考慮しないことに注意してください。

重複を検討したい場合は、@JustinNiessnerの手法を使用してください。中間ルックアップを使用した代替方法は次のとおりです。

var words = myString.Split().ToLookup(word => word);
var numMatches = myList.Sum(interestingWord => words[interestingWord].Count());
于 2010-10-20T19:10:13.570 に答える
0

これは機能します\bred\ b | \ bblue \ b | \ bgreen\b最適化されているかどうかわかりません

于 2010-10-20T19:12:37.360 に答える