Domanda

Ho una lista:

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

Ho una stringa:

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

Sto cercando di ottenere un conteggio di partite di parole myList all'interno myString. Attualmente, sto usando .Contains(), il che mi fa un conteggio di 3, perché è in ripresa il "rosso" in "Alfred". Ho bisogno di essere in grado di parole osolate invece. Come può essere raggiunto?

var count = myList.Where(ml => myString.Contains(ml)); // gets 3, want 2
È stato utile?

Soluzione

        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 vi darà il numero di volte in rosso, blu o verde si trovano. \ B specifica limite di parola.

Ogni elemento di m è del tipo di corrispondenza, e si può guardare ogni indice per maggiori informazioni (ad esempio m [0] .Value ti dà la stringa corrispondente (rosso) e m [0] .Index ti dà la posizione nella stringa originale (13)).

Altri suggerimenti

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

Una cosa come questa?

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

Si noti che questo non considera le occorrenze duplicati.

Se si vuole prendere in considerazione i duplicati, andare con la tecnica di @Justin Niessner. Ecco un'alternativa, con una ricerca intermediario:

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

Questa opere \ Allevati \ b | \ bBlue \ b | \ bgreen \ b Non sono sicuro che è più ottimizzato

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top