Frage

Ich habe eine Liste:

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

Ich habe eine Zeichenfolge:

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

Ich versuche, eine Anzahl von Übereinstimmungen von Worten in myList innerhalb myString zu bekommen. Derzeit verwende ich .Contains(), die mir eine Zählung von 3 bekommt, weil es die „rot“ in „Alfred“ aufnimmt. Ich brauche stattdessen osolate Wörter zu können. Wie kann dies erreicht werden?

var count = myList.Where(ml => myString.Contains(ml)); // gets 3, want 2
War es hilfreich?

Lösung

        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 werden Sie die Anzahl der Male, rot, blau oder grün zu finden sind. \ B gibt an Wortgrenze.

Jedes Element m ist vom Typ Match, und Sie bei jedem Index aussehen können weitere Informationen (dh m zu erhalten [0] .Wert gibt Ihnen die gefundenen String (rot) und m [0] .Index Sie den Speicherort gibt in der ursprünglichen Zeichenkette (13)).

Andere Tipps

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

So etwas wie das?

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

Beachten Sie, dass dies keine doppelten Ereignisse nicht berücksichtigt.

Wenn Sie Duplikate prüfen wollen, gehen Sie mit @Justin Niessner sprühte. Hier ist eine Alternative, mit einem Zwischen Lookup:

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

Diese Werke \ Gezüchtet \ b | \ bBlue \ b | \ bgreen \ b Ich bin nicht sicher, dass es am besten optimierte

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top