Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用哈希集的比较器_C#_Templates_Dictionary_Hashset - Fatal编程技术网

C# 如何使用哈希集的比较器

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

作为我在这里提出的另一个问题的结果,我想为我的对象使用HashSet

我将创建包含字符串和对其所有者的引用的对象

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];
    }
}