Можно ли сделать HashSet подклассом словаря? - PullRequest
0 голосов
/ 25 марта 2019

Я пытаюсь создать универсальный тип для обработки всех моих ссылок между сущностями C #.

  • В одном случае reference - это просто int ID, поэтому правильные данныеструктура для запоминания того, где и какой сущностью она была использована, будет HashSet<int>
  • . В другом сценарии сущность может использоваться в древовидной структуре, поэтому мне нужно запомнить как int Id, так и путь, который являетсяколлекция предметов.Правильная структура данных будет Dictionary<int, Tvalue>

Вот что я имею до сих пор:

public class References<TValue> : Dictionary<int, TValue>
{
}

public class References : HashSet<int>
{
}

public class MyEntityWithDefaultReferences
{
    public References References;
}

public class MyEntityWithPathReferences<PathType>
{
     public References<PathType> References;
}

Есть ли способ заставить второй References класс наследовать от первогоодин?Так что я могу использовать родительский класс где угодно.

1 Ответ

0 голосов
/ 25 марта 2019

Ну как на счет этого

public interface MyReference{
    int Id{get;set;}
}

public class SimpleReference : MyReference
{
    public int Id{get;set;}
}
public class CompoundReference<T> : MyReference
{
    public int Id{get;set;}
    public T TValue{get;set;}
}

public class ReferenceCollection : KeyedCollection<int, MyReference>
{
    protected override int GetKeyForItem(MyReference item)
    {
        return item.Id;
    }
}

И вы можете использовать как

SimpleReference sr = new SimpleReference(){Id=1};
CompoundReference<string> cr = new CompoundReference<string>(){Id=2,TValue="Test"};

ReferenceCollection col = new ReferenceCollection();
col.Add(sr);
col.Add(cr);
Console.WriteLine(col.Contains(1)); //true
Console.WriteLine(col.Contains(2)); //true
Console.WriteLine(col.Contains(3)); //false
var i1 = col[1]; //returns sr
var i2 = col[2]; //return cr
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...