LINQ 'join' ожидает равных, но я хотел бы использовать 'содержит' - PullRequest
12 голосов
/ 23 сентября 2011

Это небольшой побочный проект, с которым я возился и хотел получить некоторую информацию о том, что я могу делать неправильно. У меня есть «словарь» букв и их соответствующие оценки и список слов. Моя идея состояла в том, чтобы найти буквы, которые были в каждом слове, и суммировать результаты вместе.

// 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
                     };

Любая помощь будет принята с благодарностью. Спасибо.

1 Ответ

19 голосов
/ 23 сентября 2011

Вы не можете, в принципе - Join в LINQ - это всегда эквиджоин. Вы можете достичь желаемого эффекта, но не с помощью соединения. Вот пример:

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

Я думаю это то, что вы пытались сделать со своим запросом, хотя он не даст вам оценку слова. Для полного набора слов я бы построил словарь от буквы к баллу, например:

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

Затем вы можете найти оценку для каждого слова, суммируя оценку для каждой буквы:

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

Или не как выражение запроса:

var results = words.Select(w => new { Word = w,
                                      Score = w.Sum(c => scoreDictionary[c]) });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...