2011-09-22 16 views
9

Este es un pequeño proyecto del lado scrabble con el que estaba retocando y quería obtener información sobre lo que podría estar haciendo mal. Tengo un "diccionario" de letras y sus respectivos puntajes y una lista de palabras. Mi idea era encontrar las letras que estaban en cada palabra y sumar los puntajes.LINQ 'join' espera un igual pero me gustaría usar 'contains'

// Create a letter score lookup 
var letterScores = new List<LetterScore> 
         { 
          new LetterScore {Letter = "A", Score = 1}, 
          // ... 
          new LetterScore {Letter = "Z", Score = 10} 
         }; 

// Open word file, separate comma-delimited string of words into a string list 
var words = File.OpenText("c:\\dictionary.txt").ReadToEnd().Split(',').ToList();       

// I was hoping to write an expression what would find all letters in the word (double-letters too) 
// and sum the score for each letter to get the word score. This is where it falls apart. 
var results = from w in words 
      join l in letterScores on // expects an 'equals' 
      // join l in letterScores on l.Any(w => w.Contains(
      select new 
        { 
         w, 
         l.Score 
        }; 

Cualquier ayuda sería muy apreciada. Gracias.

Respuesta

15

No se puede, básicamente - Join en LINQ es siempre una equijoin. Puede lograr el efecto que desee, pero no con join. He aquí un ejemplo:

var results = from w in words 
       from l in letterScores 
       where l.Any(w => w.Contains(l.Letter)) 
       select new { w, l.Score }; 

I que esto es lo que estaba tratando de hacer con su consulta, a pesar de que no le dará la palabra puntuación. Para la partitura palabra, construiría un diccionario de la carta de anotar, como esto:

var scoreDictionary = letterScores.ToDictionary(l => l.Letter, l => l.Score); 

entonces usted puede encontrar la puntuación de cada palabra sumando la puntuación de cada letra:

var results = from w in words 
       select new { Word = w, Score = w.Sum(c => scoreDictionary[c]) }; 

O no como una expresión de consulta:

var results = words.Select(w => new { Word = w, 
             Score = w.Sum(c => scoreDictionary[c]) }); 
+0

Thanks! Eso fue todo. Sin embargo, en los dos últimos bloques de código parece que quisiste usar * scoreDictionary * en lugar de * letterScores *. –

+0

@Andy: Gracias, reparado :) –

Cuestiones relacionadas