2010-05-21 5 views
2

Je suis un peu coincé ici et je ne peux pas penser plus loin.Comparer toutes les valeurs d'une liste les unes par rapport aux autres

public struct CandidateDetail 
    { 
     public int CellX { get; set; } 
     public int CellY { get; set; } 
     public int CellId { get; set; }   
    } 

var dic = new Dictionary<int, List<CandidateDetail>>(); 

Comment puis-je comparer chaque élément CandidateDetail contre d'autres éléments CandidateDetail dans le même dictionnaire de la manière la plus efficace? Exemple: Il y a trois clés pour le dictionnaire: 5, 6 et 1. Nous avons donc trois entrées. maintenant chacune de ces entrées clés aurait une liste associée. Dans ce cas, disons que chacun de ces trois nombres a exactement deux items CandidateDetails dans la liste associée à chaque clé. Cela signifie en d'autres termes que nous avons deux 5, deux 6 et deux 1 dans différentes ou dans les mêmes cellules. Je voudrais savoir:

si [5] .1stItem.CellId == [6] .1stItem.CellId => nous avons eu un succès. Cela signifie que nous avons un 5 et un 6 dans la même cellule if [5] .2ndItem.CellId == [6] .2ndItem.CellId => perfect. Nous avons découvert que les autres 5 et 6 sont ensemble dans une cellule différente. if [1] .1stItem.CellId == ...

Maintenant, j'ai besoin de vérifier le 1 aussi contre l'autre 5 et 6 pour voir si celui-ci existe dans les deux mêmes cellules précédentes ou non.

Une expression de Linq pourrait-elle aider? Je suis assez coincé ici ... Je ne sais pas ... Peut-être que je prends la mauvaise approche. J'essaie de résoudre la "paire cachée" du jeu Sudoku. :)

http://www.sudokusolver.eu/ExplainSolveMethodD.aspx

Merci beaucoup, Kave

Répondre

0
from kvp1 in dic 
from i1 in Enumerable.Range(0, kvp1.Value.Count) 
let candidate1 = kvp1.Value[i2] 
from kvp2 in dic 
where kvp2.Key >= kvp1.Key 
from i2 in Enumerable.Range(0, kvp2.Value.Count) 
let candidate2 = kvp2.Value[i2] 
where kvp1.Key != kvp2.Key || i2 > i1 
where candidate1.CellId == candidate2.CellId 
select new { 
    Key1 = kvp1.Key, 
    Key2 = kvp2.Key, 
    Candidate1 = candidate1, 
    Candidate2 = candidate2 
} 

Vous pouvez modifier la seule clause select pour les informations que vous souhaitez ou ajouter un autre where clause si vous ne souhaitez que des candidats correspondant à des clés différentes.

+0

Ceci sélectionne chaque paire deux fois (c1, c2) et (c2, c1) et sélectionne des paires où Candidate1 et Candidate2 sont le même objet (c1, c1). –

+0

Oui, vous avez raison. J'ai changé le code, mais cela le rend beaucoup moins lisible. – svick

+0

Salut, j'apprécie les réponses. Êtes-vous sûr que la troisième ligne est correcte? let candidate1 = kvp1.Value [i2] Ne devrait-il pas être plutôt [i1]? Sinon, il ne compile pas. Mais je n'obtiens aucun résultat une fois que tout ce code est stocké dans un test var énumérable. Ne semble pas trouver quoi que ce soit. Mais je dois admettre que je suis relativement nouveau à Linq. – Houman

Questions connexes