首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我正在尝试实现这个接口,但需要一些帮助:

我正在尝试实现这个接口,但需要一些帮助:
EN

Stack Overflow用户
提问于 2015-01-07 19:32:28
回答 4查看 510关注 0票数 0

这是IEnumerable接口,在其中添加一些单词并返回最后两个方法

代码语言:javascript
复制
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();
    }
}

这是我的代码,我的问题是AddSynonyms方法中的param,当我调用GetSynonymsGetWords方法时,我不知道如何修复它。

代码语言:javascript
复制
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;
        }
    }
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-01-07 20:11:07

这里是我最好的客人,介绍如何实现该接口。请注意,您可能希望使用不同的内部数据结构--基于将多少数据放入主题词库,或者如果您需要AddSynonymsGetSynonyms更早的话。此外,还有一些错误检查和角落情况可能无法在这里处理,但我希望这至少能给您一个接口应该如何实现的想法。

代码语言:javascript
复制
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列表减去word)。

然后,GetSynonymns方法只返回与给定word相关联的List。如果单词不在叙词表中,则返回一个空枚举(如果需要,可以更改该枚举以抛出异常)。

GetWords方法只返回Dicitionary的所有键,这将是添加的每个单词。

这段代码将创建大量的重复,因为每个单词都将引用Dicitionary中的同义词列表。但这将导致GetSynonymsGetWords方法的速度相当快。但是,随着内部AddSynonyms的增长,Dicitionary会变得更慢。

这并不能验证发送到方法中的参数是否为空。它还允许您将“这是一个句子”之类的东西作为"123456“的同义词进行关联,因此基本上任何字符串都可以是任何其他字符串的同义词。

票数 0
EN

Stack Overflow用户

发布于 2015-01-07 19:40:12

AddSynonyms(IEnumerable同义词)是一种不能从GetSynonyms()或GetWords()调用的方法。

实现IThesaurus的类应该维护一个受保护的属性,如下所示:

代码语言:javascript
复制
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>>继承的接口,其中字符串是存储同义词的单词,List是单词的同义词。您还可以放弃ISynonyms接口,只需使用以下内容:

代码语言:javascript
复制
protected IDictionary<string, List<string>> {get; set;}

然后将其设置为构造函数中的新Dictionary>()。

票数 1
EN

Stack Overflow用户

发布于 2015-01-07 19:46:54

首先,我认为您打算在add方法中返回一个IEnumerable,因为您的输入参数甚至从未被使用过。所以我认为你打算这样做:

代码语言:javascript
复制
public interface IThesaurus
{

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

        IEnumerable<string> GetWords();

}

您的问题还不清楚,但是您需要在类上实现您的接口,现在您将无法获得AddSynonyms错误消息。

现在您可以实现这个接口了:

代码语言:javascript
复制
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本身是“同义词”:)您应该使其中一个方法具有不同的用途。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27827204

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档