J'ai un tableau de string nommé permutation qui peut contenir jusqu'à 200000 élements
et une liste de string nommé dico(7)
dico(7) de taille 57000
je veux savoir si un élement de permutation
se trouve dans dico(7)
j'ai écrit le code suivant
Private Function FindWordInList(ByVal index As Integer, ByVal permutation As String()) As String()
Dim sql = (From value As String In permutation Select value Where listdico(index).Contains(value)).ToArray
Return sql
End Function
le problème cela un temps pour
possible que le LINQ prend beaucoup de temps
J'ai essayé chez moi les 'predicates' qui sont très rapides :
Public Class Form1
Dim texte As String
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim liste As New List(Of String)
Using r As New IO.StreamReader("mots.txt")
liste.AddRange(r.ReadToEnd.Split(Environment.NewLine))
End Using
texte = "BA"
Dim items As List(Of String) = liste.FindAll(AddressOf Cherche)
'... moins de 1 seconde
End Sub
Private Function Cherche(ByVal mot As String) As Boolean
If mot.Contains(texte) Then Return True Else Return False
End Function
End Class
Bonsoir Banana32
Oui pour le jeu des chiffres et des lettres
j'ai presque fini
les chiffres sont fait avec solution
toutes les solutions possible
le temps cela dépend 10 secondes pour
400 solutions différentes
ton code est bon pour trouver un mot seulement
dans une liste
j'ai besoin de trouver tous les mots de la listeA qui se trouve dans la listB
et listA contient plus de 200000 mots
et listB 50000
dans le jeu
avec les lettres sorties au tirage
je trouve toutes les combinaisons possibles
de 2 à 8 lettres et pour chaque combinaison
je crée toute les permutations possible
et ensuite cherche tous les mots existants
avec 8 lettres c'est assez rapide
avec 9 lettres c'est prend ......
pour le coup j'ai réduit le tirage au sort
à 8 lettres
Vous n’avez pas trouvé la réponse que vous recherchez ?
Sinon j'avais fait ceci pour chercher tous les mots possibles dans un dico en partant d'un mélange de lettre (je te l'ai simplifié).
La liste 'resultats' est triée par longueur de mots.
Option Strict On
Public Class Form1
Dim Mots As New List(Of String)
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'chargement fichier de mots
Using r As New IO.StreamReader("mots.txt")
Mots.AddRange(r.ReadToEnd.Split(New String() {Environment.NewLine}, StringSplitOptions.None))
End Using
Dim resultats As List(Of String) = ChercherMots("SONPISOSAND")
'.... resultats ici
End Sub
Public Function ChercherMots(ByVal Melange As String) As List(Of String)
Dim motsf As New List(Of String)
For Each mot As String In Mots
Dim masque As String = mot
For Each lettre As String In Melange
If masque.Contains(lettre) Then
masque = Replace(masque, lettre, "", 1, 1)
End If
Next
If masque.Length = 0 Then motsf.Add(mot)
Next
'tri par longeur de mot
motsf.Sort(New clsCompare)
Return motsf
End Function
Class clsCompare
Implements IComparer(Of String)
Public Function Compare(ByVal x As String, ByVal y As String) As Integer Implements System.Collections.Generic.IComparer(Of String).Compare
If x.Length > y.Length Then
Return -1
ElseIf x.Length = y.Length Then
Return 0
Else
Return 1
End If
End Function
End Class
End Class
Private Function FindWordInList(ByVal index As Integer, ByVal permutation As String()) As List(Of String)
Dim id As Integer
Dim listresult As New List(Of String)
For Each item In permutation
id = listdico(index).BinarySearch(item)
If id >= 0 Then
listresult.Add(item)
End If
Next
Return listresult
End Function