2011-03-22 9 views
1

Cela devrait être assez simple, mais Contains() de LINQ ne prend pas de tableau. J'ai 2 tableaux de chaînesVérifiez si une chaîne dans un tableau apparaît dans un autre tableau de chaînes dans LINQ?

e.g.1 { « La », « rapide », « Brown »}

Et je veux comparer un autre tableau de chaînes et renvoie true si une chaîne apparaît en elle.

e.g.2 { "Ce", "ne marche pas", "rapide", "travail"}

donc "rapide" apparaît dans le 2ème tableau.

Est-il préférable de délimiter la première chaîne par des virgules afin qu'elle ressemble à "The, quick, Brown" et qu'elle soit en cours d'exécution dans une boucle?

Je suis sûr que cela peut être fait correctement en utilisant LINQ.

Répondre

2
var first = new[] {"the", "quick", "brown"}; 
var second = new[] {"This","doesnt","quick","Work"}; 

var found = from a in first 
      from b in second 
      where a == b 
      select a; 

if(found.Any()) 
    return true; 
+0

Ceci est O (n * m) alors que l'utilisation de 'Intersect' devrait être O (n + m). Cela n'aura pas d'importance pour des exemples comme celui-ci, mais cela pourrait faire une grande différence pour des séquences plus grandes. – LukeH

+0

ok merci, ce qui est plus efficace alors? – jaffa

+0

@Jon: L'utilisation de 'Intersect' est plus efficace (bien que cela ne soit probablement pas le cas si les séquences sont petites). – LukeH

6
bool exists = first.Intersect(second).Any(); 

Ou, si vous voulez savoir ce que les mots sont en réalité:

var commonWords = first.Intersect(second); 

foreach (string s in commonWords) 
{ 
    Console.WriteLine(s); 
} 
0

Je pense que je l'utilise:

var query = from a in first 
      where b.Contains(a) 
      select a; 

var isThereAMatch = query.Any(); 

Si les listes étaient très les grandes et les correspondances étaient susceptibles d'être éparses, alors je pourrais optimiser cela en utilisant un lookup/hashset pour b.

Questions connexes