[英]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();
}
}
這是我的代碼,當我調用GetSynonyms
和GetWords
方法時,我的問題是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本身是“同義詞” :),您應使其中一種方法具有不同的用途。
關於如何實現該接口,這是我最好的客人。 請注意,您可能要根據放入同義詞庫中的數據量來使用不同的內部數據結構,或者是否需要AddSynonyms
比GetSynonyms
更GetSynonyms
。 另外,這里可能不會處理一些錯誤檢查和極端情況,但是我希望這至少可以使您對接口的實現方式有所了解。
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
中的同義詞列表。 但這將導致GetSynonyms
和GetWords
方法相當快。 但是,隨着內部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.