2011-09-22 8 views
9

का उपयोग करना चाहता हूं यह एक छोटी स्क्रैबल साइड प्रोजेक्ट है जिसके साथ मैं झुका रहा था और मैं कुछ गलत कर रहा था, इस पर कुछ इनपुट प्राप्त करना चाहता था। मेरे पास अक्षरों का एक "शब्दकोश" और उनके संबंधित स्कोर और शब्दों की एक सूची है। मेरे विचार उन शब्दों को ढूंढना था जो प्रत्येक शब्द में थे और स्कोर एक साथ जोड़ते थे।LINQ 'join' एक बराबर की अपेक्षा करता है लेकिन मैं 'शामिल'

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

किसी भी मदद की सराहना की जाएगी। धन्यवाद।

उत्तर

15

आप नहीं, मूल रूप से कर सकते हैं - LINQ में Joinहमेशा एक equijoin है। आप जो प्रभाव चाहते हैं उसे प्राप्त कर सकते हैं, लेकिन शामिल होने के साथ नहीं।

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

मुझे लगता है कि यह है कि क्या आप अपनी क्वेरी के साथ क्या करने की कोशिश कर रहे थे, हालांकि यह आप शब्द स्कोर नहीं देंगे,: यहाँ एक उदाहरण है। पूर्ण शब्द स्कोर के लिए, मैं स्कोर करने के लिए, इस तरह पत्र से एक शब्दकोश का निर्माण चाहते हैं:

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

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

तो फिर तुम प्रत्येक अक्षर के लिए स्कोर संक्षेप द्वारा प्रत्येक शब्द के लिए स्कोर प्राप्त कर सकते हैं

या क्वेरी अभिव्यक्ति के रूप में नहीं:

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

धन्यवाद! वह यह था। हालांकि, आपके पिछले दो कोड ब्लॉक में ऐसा लगता है कि आप * letterScores * के बजाय * scoreDictionary * का उपयोग करना चाहते थे। –

+0

@ एंडी: धन्यवाद, तय :) –

संबंधित मुद्दे