C# 如何使用哈希集的比较器
作为我在这里提出的另一个问题的结果,我想为我的对象使用HashSet 我将创建包含字符串和对其所有者的引用的对象C# 如何使用哈希集的比较器,c#,templates,dictionary,hashset,C#,Templates,Dictionary,Hashset,作为我在这里提出的另一个问题的结果,我想为我的对象使用HashSet 我将创建包含字符串和对其所有者的引用的对象 public class Synonym { private string name; private Stock owner; public Stock(string NameSynonym, Stock stock) { name=NameSynonym; owner=stock } // [+ 'get' for
public class Synonym
{
private string name;
private Stock owner;
public Stock(string NameSynonym, Stock stock)
{
name=NameSynonym;
owner=stock
}
// [+ 'get' for 'name' and 'owner']
}
我知道我需要一个比较器,但以前从未用过。我应该创建一个单独的类吗?比如:
public class SynonymComparer : IComparer<Synonym>
{
public int Compare(Synonym One, Synonym Two)
{ // Should I test if 'One == null' or 'Two == null' ????
return String.Compare(One.Name, Two.Name, true); // Caseinsesitive
}
公共类同义词比较器:IComparer
{
公共int比较(同义词1、同义词2)
{//我应该测试“One==null”还是“Two==null”????
返回String.Compare(One.Name,Two.Name,true);//caseinsitive
}
}
我更喜欢将函数(或嵌套类[可能是单例?]如果需要)作为类同义词的一部分,而不是另一个(独立)类。这可能吗
关于用法:
因为我以前从未使用过这种东西,所以我想我必须在类同义词中编写一个Find(stringnamesynonym)函数,但我应该怎么做呢
public class SynonymManager
{
private HashSet<SynonymComparer<Synonym>> ListOfSynonyms;
public SynonymManager()
{
ListOfSymnonyms = new HashSet<SynonymComparer<Synonym>>();
}
public void SomeFunction()
{ // Just a function to add 2 sysnonyms to 1 stock
Stock stock = GetStock("General Motors");
Synonym otherName = new Synonym("GM", stock);
ListOfSynonyms.Add(otherName);
Synonym otherName = new Synonym("Gen. Motors", stock);
ListOfSynonyms.Add(otherName);
}
public Synonym Find(string NameSynomym)
{
return ListOfSynonyms.??????(NameSynonym);
}
}
公共类管理器
{
私有哈希集ListOfSynonyms;
公共事务经理()
{
ListOfSymnonyms=新哈希集();
}
公共函数()
{//只是一个函数,用于将2个sysnonym添加到1个stock
股票=GetStock(“通用汽车”);
同义词otherName=新同义词(“GM”,股票);
添加(其他名称);
同义词otherName=新同义词(“通用汽车”,股票);
添加(其他名称);
}
公共同义词查找(字符串名称SYNMYM)
{
返回synonyms的列表(NameSynonym);
}
}
在上面的代码中,我不知道如何实现“Find”方法。我该怎么做
任何帮助都将不胜感激
(PS如果我关于如何实现它的想法是完全错误的,请让我知道并告诉我如何实现)完全放弃
同义词
类,让同义词列表成为字符串的口述的(或者,如果有这样的东西,HashDictionary
)不是更合理吗
(我对C#类型不是很熟悉,但我希望这能传达出一般的想法)
我推荐的答案(经过编辑,现在符合实际情况):
IDictionary>ListOfSynonyms=newdictionary>();
IDictionary>ListOfSynForms=new Dictionary>();
类别股票
{
...
Stock addSynonym(字符串syn)
{
ListOfSynForms[syn.ToUpper()]=syn;
返回listofSynoyms[syn.ToUpper()]=this;
}
数组findSynonyms()
{
返回ListOfSynonyms.findKeysFromValue(this.map)(x=>ListOfSynForms[x]);
}
}
...
GetStock(“通用汽车”).addSynonym(“GM”).addSynonym(“通用汽车”);
...
尝试
{
…ListOfSynonyms[同义词]。名称。。。
}
捕获(边界外e)
{
...
}
...
//输出与GM同义的所有内容。这是C#和Python的混合
... GetStock(“通用汽车”)。FindSynoyms()
//测试是否存在同义词
if(输入到同步列表中)
{
...
}
您始终可以使用LINQ进行查找:
public Synonym Find(string NameSynomym)
{
return ListOfSynonyms.SingleOrDefault(x => x.Name == NameSynomym);
}
但是,您是否考虑过改用字典,我相信它更适合提取单个成员,并且您仍然可以保证根据您选择的键不会有重复项
我不确定查找时间是否为单值或默认值,但我非常确定它是线性的(O(n)),因此如果查找时间对您很重要,字典将为您提供O(1)查找时间。哈希集不需要IComparer
-它需要iQualityComparer
,例如
public class SynonymComparer : IEqualityComparer<Synonym>
{
public bool Equals(Synonym one, Synonym two)
{
// Adjust according to requirements.
return StringComparer.InvariantCultureIgnoreCase
.Equals(one.Name, two.Name);
}
public int GetHashCode(Synonym item)
{
return StringComparer.InvariantCultureIgnoreCase
.GetHashCode(item.Name);
}
}
公共类同义词比较器:IEqualityComparer
{
公共布尔等于(同义词1,同义词2)
{
//根据需要进行调整。
返回StringComparer.InvariantCultureIgnoreCase
.Equals(1.Name,2.Name);
}
public int GetHashCode(同义词项)
{
返回StringComparer.InvariantCultureIgnoreCase
.GetHashCode(项目名称);
}
}
但是,当前代码只能编译,因为您正在创建一组比较器,而不是一组同义词
此外,我认为你根本不想要一套。在我看来,您需要一本字典或一个查找,这样您就可以找到给定名称的同义词:
public class SynonymManager
{
private readonly IDictionary<string, Synonym> synonyms = new
Dictionary<string, Synonym>();
private void Add(Synonym synonym)
{
// This will overwrite any existing synonym with the same name.
synonyms[synonym.Name] = synonym;
}
public void SomeFunction()
{
// Just a function to add 2 synonyms to 1 stock.
Stock stock = GetStock("General Motors");
Synonym otherName = new Synonym("GM", stock);
Add(otherName);
ListOfSynonyms.Add(otherName);
otherName = new Synonym("Gen. Motors", stock);
Add(otherName);
}
public Synonym Find(string nameSynonym)
{
// This will throw an exception if you don't have
// a synonym of the right name. Do you want that?
return synonyms[nameSynonym];
}
}
公共类管理器
{
专用只读IDictionary同义词=新建
字典();
专用void Add(同义词)
{
//这将覆盖具有相同名称的任何现有同义词。
同义词[同义词.名称]=同义词;
}
公共函数()
{
//只是一个函数,用于将2个同义词添加到1个股票中。
股票=GetStock(“通用汽车”);
同义词otherName=新同义词(“GM”,股票);
添加(其他名称);
添加(其他名称);
otherName=新的同义词(“通用汽车”,股票);
添加(其他名称);
}
公共同义词查找(字符串nameSynonym)
{
//如果没有,这将抛出一个异常
//一个正确名字的同义词。你想要吗?
返回同义词[nameSynonym];
}
}
请注意,上面的代码中有一些问题,关于您希望它在各种情况下的行为。你需要弄清楚你想要它做什么
编辑:如果你想为一个同义词存储多个股票,你实际上需要一个查找
——但这是不可变的。您可能最好存储一本词典
;每个字符串的股票列表
关于不从Find
引发错误,您应该查看Dictionary.TryGetValue
,如果找不到键,它不会引发异常(还返回是否找到键);映射值在out参数中“返回”。我需要能够找到与每个特定同义词相关的股票(当然在本例中没有显示,但在realit中)
public class SynonymManager
{
private readonly IDictionary<string, Synonym> synonyms = new
Dictionary<string, Synonym>();
private void Add(Synonym synonym)
{
// This will overwrite any existing synonym with the same name.
synonyms[synonym.Name] = synonym;
}
public void SomeFunction()
{
// Just a function to add 2 synonyms to 1 stock.
Stock stock = GetStock("General Motors");
Synonym otherName = new Synonym("GM", stock);
Add(otherName);
ListOfSynonyms.Add(otherName);
otherName = new Synonym("Gen. Motors", stock);
Add(otherName);
}
public Synonym Find(string nameSynonym)
{
// This will throw an exception if you don't have
// a synonym of the right name. Do you want that?
return synonyms[nameSynonym];
}
}