2011-05-16 3 views
5

Question principale:
Ok les gars, voici la situation, nous allons examiner 2 tableaux de chaînes:Comment vérifier si les chaînes dans un tableau contiennent des chaînes d'un autre tableau

string foo = { "Roses are #FF0000" , "Violets are #0000FF", "Paint it #000000"} 
string bar = { "Guns", "Roses", "Violets"} 

Quel est le « plus petit nombre de code lignes "façon de récupérer des chaînes dans foo contenant des chaînes dans la barre?
(à savoir dans ce cas, les 2 premiers éléments de foo)

Bien sûr, je veux éviter de faire toute la logique « à la main », comme je suis sûr que Linq est plus efficace avec la fonction Intersection, mais je Je ne sais pas comment l'utiliser pour effectuer cette tâche précise.

: départage
1- si foo contient des chaînes qui contiennent plus d'un élément de la barre,

string foo = { "Roses are #FF0000" , "Violets are #0000FF", "Paint it #000000"} 
string bar = { "Roses", "Violets", "are"} 

Et je veux éviter les doublons? Que dois-je faire si j'ai 2 groupes de barres que je veux comparer à un groupe de foo?
Est-il plus efficace de fusionner bar1 et bar2 ou d'effectuer le filtrage avec bar1 en premier, puis avec bar2?


Thanx et amusez-vous répondre :-)

Répondre

6

LINQ fonctionne bien, oui:

var mixed = foo.Where(x => bar.Any(y => x.Contains(y)); 

Notez que vous ne verrez encore une fois chaque élément de foo, le cas échéant.

Si vous avez plusieurs bar tableaux, vous pouvez utiliser:

var mixed = foo.Where(x => bar1.Concat(bar2) 
           .Any(y => x.Contains(y)); 
1
string[] foo = new string[] { "Roses are #FF0000", "Violets are #0000FF", "Paint it #000000" }; 
string[] bar = new string[] { "Guns", "Roses", "Violets" }; 

var matches = from f in foo 
       where bar.Any(b => f.Contains(b)) 
       select f; 

foreach (var m in matches) 
    Console.WriteLine(m); 
+0

Eh oui cela fonctionne aussi (qui était la syntaxe que je l'ai utilisé il y a quelques années) mais il est plus rapide faire sans les instructions select et from. Merci. –

+0

@Mika, je préfère la syntaxe de la requête, en particulier lorsque les requêtes deviennent plus grandes que cette taille. Je le trouve plus lisible. –

2

En supposant que le string dans votre description est votre faute de frappe de l'enseignant,

var result=foo.Where(w=>bar.Any(iw=>w.Contains(iw))); 

Je ne suis pas sûr de ce double emploi vous voulez dire, cela montrera seulement les éléments dans foo une fois, peu importe combien de fois ils apparaissent dans bar.

Quant au 2e départage, tout ce que vous avez à faire est quelque chose comme ceci:

var result=foo.Where(w=>bar1.Any(iw=>w.Contains(iw))||bar2.Any(iw=>w.Contains(iw))); 
+0

ThanX Cela fonctionne bien mais j'ai dû inverser 'iw => iw.Contains (w)' à 'iw => w.Contains (wi)' pour le faire fonctionner. Aussi, j'ai changé le || à && (J'ai choisi votre dernière proposition de syntaxe parce que cela a du sens pour moi, formez une perspective de lecture de code.) –

+0

|| signifie que dans l'un d'eux, && signifie dans les deux, je suppose que vous vouliez dire le premier. – Blindy

Questions connexes