这是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();
}
}这是我的代码,我的问题是AddSynonyms方法中的param,当我调用GetSynonyms和GetWords方法时,我不知道如何修复它。
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;
}
}
}发布于 2015-01-07 20:11:07
这里是我最好的客人,介绍如何实现该接口。请注意,您可能希望使用不同的内部数据结构--基于将多少数据放入主题词库,或者如果您需要AddSynonyms比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列表减去word)。
然后,GetSynonymns方法只返回与给定word相关联的List。如果单词不在叙词表中,则返回一个空枚举(如果需要,可以更改该枚举以抛出异常)。
GetWords方法只返回Dicitionary的所有键,这将是添加的每个单词。
这段代码将创建大量的重复,因为每个单词都将引用Dicitionary中的同义词列表。但这将导致GetSynonyms和GetWords方法的速度相当快。但是,随着内部AddSynonyms的增长,Dicitionary会变得更慢。
这并不能验证发送到方法中的参数是否为空。它还允许您将“这是一个句子”之类的东西作为"123456“的同义词进行关联,因此基本上任何字符串都可以是任何其他字符串的同义词。
发布于 2015-01-07 19:40:12
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>>继承的接口,其中字符串是存储同义词的单词,List是单词的同义词。您还可以放弃ISynonyms接口,只需使用以下内容:
protected IDictionary<string, List<string>> {get; set;}然后将其设置为构造函数中的新Dictionary>()。
发布于 2015-01-07 19:46:54
首先,我认为您打算在add方法中返回一个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本身是“同义词”:)您应该使其中一个方法具有不同的用途。
https://stackoverflow.com/questions/27827204
复制相似问题