質問

リストがあります:

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
役に立ちましたか?

解決

        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]を与えます。インデックスは元の場所を提供します。文字列(13))。

他のヒント

var count = (from s in myList
            join ms in myString.Split() on s equals ms
            select new { s, ms }).Count();

このようなもの?

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

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

重複を検討したい場合は、@justin niessnerのテクニックをご覧ください。これが代替案です。仲介者の検索があります。

var words = myString.Split().ToLookup(word => word);
var numMatches = myList.Sum(interestingWord => words[interestingWord].Count());

これは bred b | bblue b | bgreen bそれが最も最適化されているかどうかわからない

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top