簡體   English   中英

我正在嘗試實現此接口,但需要一些幫助:

[英]I am trying to implement this interface, but need some help:

這是IEnumerable接口,其中添加了一些單詞並在最后兩種方法中返回

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Thesaurus {

    /// <summary>
    /// Represents a thesaurus.
    /// </summary>
    public interface IThesaurus {
        /// <summary>
        /// Adds the given synonyms to the thesaurus
        /// </summary>
        /// <param name="synonyms">The synonyms to add.</param>
        void AddSynonyms(IEnumerable < string > synonyms);

        /// <summary>
        /// Gets the synonyms for a given word.
        /// </summary>
        /// <param name="word">The word the synonyms of which to get.</param>
        /// <returns>A <see cref="string"/> with all synonyms for the given word.</returns>
        IEnumerable < string > GetSynonyms(string word);

        /// <summary>
        /// Gets all words from the thesaurus.
        /// </summary>
        /// <returns>An <see cref="IEnumerable<string>"/> containing
        /// all the words in the thesaurus.</returns>
        IEnumerable < string > GetWords();
    }
}

這是我的代碼,當我調用GetSynonymsGetWords方法時,我的問題是AddSynonyms方法中的參數,但我不知道如何解決。

public class Thesaurus {

    public void AddSynonyms(IEnumerable < string > synonyms) {
        synonyms = new List < string > () {
            "one", "two", "three"
        };
    }

    public IEnumerable < string > GetSynonyms(string word) {
        foreach(String s in AddSynonyms()) {
            if (s == word) {
                yield return s;
            }
        }
    }

    public IEnumerable < string > GetWords() {
        foreach(String s in AddSynonyms()) {
            yield return s;
        }
    }
}

AddSynonyms(IEnumerable同義詞)是一種不會從GetSynonyms()或GetWords()調用的方法。

實現IThesaurus的類應維護一個類似於以下內容的受保護屬性:

protected List<ISynonyms> Synonyms {get; set;}

GetSynonyms(string word) and GetWords() should be returning Items from that Property.

AddSynonym(IEnumerable<string> synonyms) will be adding items to that Property.

ISynonyms是從IDictionary<string, List<string>>繼承的接口,其中字符串是您要存儲的Word同義詞,而List是Word的同義詞。 您也可以放棄ISynonyms接口,而只需執行以下操作:

protected IDictionary<string, List<string>> {get; set;}

然后在構造函數中將其設置為新的Dictionary>()。

首先,我認為您的意圖是在add synonums方法中返回IEnumerable,因為甚至從未使用過您的輸入參數。 所以我認為您打算這樣做:

public interface IThesaurus
{

        IEnumerable<string> AddSynonyms();
        IEnumerable<string> GetSynonyms(string word);

        IEnumerable<string> GetWords();

}

您的問題尚不清楚,但是您需要在類上實現您的接口,現在您將不會收到AddSynonyms錯誤消息。

現在您可以實現該接口:

public class Thesaurus : IThesaurus
{
       public IEnumerable<string> AddSynonyms()
       {
          return new List<string>() {"one", "two", "three"};
       }

       public IEnumerable<string> GetSynonyms(string word)
       {
           return AddSynonyms().Where(s => s == word);
       }

       public IEnumerable<string> GetWords()
       {
           return AddSynonyms();
       }
}

請注意,GetWords和AddSynonyms本身是“同義詞” :),您應使其中一種方法具有不同的用途。

關於如何實現該接口,這是我最好的客人。 請注意,您可能要根據放入同義詞庫中的數據量來使用不同的內部數據結構,或者是否需要AddSynonymsGetSynonymsGetSynonyms 另外,這里可能不會處理一些錯誤檢查和極端情況,但是我希望這至少可以使您對接口的實現方式有所了解。

public class Thesaurus : IThesaurus
{
    private Dictionary<string, List<string>> lookup = 
        new Dictionary<string, List<string>>(); 

    public void AddSynonyms(IEnumerable<string> synonyms)
    {
        var words = synonyms.Distinct().ToList();
        foreach (var word in words)
        {
            var currentWordSynonyms = words.Where(w => w ! == word).ToList();
            if (lookup.ContainsKey(word))
            {
                foreach (var synonym in currentWordSynonyms)
                {
                    if(!lookup[word].Contains(synonym))
                        lookup[word].Add(synonym);
                }
            }
            else
            {
                lookup.Add(word, currentWordSynonyms);
            }
        }
    }

    public IEnumerable<string> GetSynonyms(string word)
    {
        if(lookup.ContainsKey(word))
            return lookup[word];
        return Enumerable.Empty<string>();
        // Or throw an exception.
    }

    public IEnumerable<string> GetWords()
    {
        return lookup.Keys();
    }
}

編輯

這里的想法是,您有一個Dicitionary ,它將每個單詞與一個同義詞List相關聯。 AddSynonyms方法將枚舉同義詞,並從創建唯一單詞列表開始,以防重復。 然后,它會遍歷每個單詞並檢查是否已添加它。 如果有,它將遍歷該單詞的所有同義詞( words列表減去word ),並檢查它們是否在與該單詞關聯的List中。 如果不是,則將同義詞添加到列表中。 如果單詞不在Dicitionary則將其與同義詞List一起添加(同樣, words list減去word )。

然后, GetSynonymns方法僅返回與給定word關聯的List 如果詞庫中沒有該單詞,則返回一個空的枚舉(如果需要,可以更改該值以引發異常)。

GetWords方法只是返回的所有按鍵Dicitionary這將是每一個加入這個詞。

這段代碼會產生很多重復,因為每個單詞都將引用Dicitionary中的同義詞列表。 但這將導致GetSynonymsGetWords方法相當快。 但是,隨着內部Dicitionary增長, AddSynonyms會變慢。

這不能驗證發送到方法中的參數是否不為空。 它還允許您將“這是一個句子”之類的東西作為“ 123456”的同義詞進行關聯,因此基本上任何字符串都可以是任何其他字符串的同義詞。

您需要寫:

public class Thesaurus :  IThesaurus
{
public void AddSynonyms(IEnumerable<string> synonyms){

 synonyms = new List<string>() { "one", "two", "three"};

}

public IEnumerable<string> GetSynonyms(string word){

foreach(String s in AddSynonyms()){

     if(s == word)
        {
         yield return s;
}
  }

public IEnumerable<string> GetWords(){

foreach(String s in AddSynonyms()){

         yield return s;
}
}
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM