C# Словарь классов с типом generi c - PullRequest
0 голосов
/ 26 января 2020

Я пытаюсь создать алгоритм Geneti c в C#, но я хочу разделить гены на классы (хромосомы)

в основном у меня есть класс ДНК, который определяется как

public class DNA<T> { public T[] Genes { get; private set; } }

чтобы у меня были гены типа double, bool, int и др. c ...

Затем я хочу определить хромосому как

class Chromosome
{
    Dictionary<string, DNA<T>> chromosomes;
}

. Я мог бы добавить к хромосоме несколько типов ДНК, таких как

chromosomes.add("brain", new DNA<double>(...));
chromosomes.add("traits", new DNA<bool>(...));
chromosomes.add("body", new DNA<int>(...));

Если значение словаря будет object или я должен создать IDNA Интерфейс к классу ДНК для хранения объекта, а затем привести его каждый раз, когда мне нужно? Или есть более простой / лучший способ сделать это? Спасибо!

1 Ответ

1 голос
/ 27 января 2020

Для нескольких типов генов, как вы написали, вы можете использовать интерфейс / абстрактный класс.

Для доступа к данным вместо приведения вы можете написать простой метод GetDNAOfType:

using System;
using System.Collections.Generic;
using System.Linq;

public class Chromosome
{
   Dictionary<string, DNA> chromosomes = new Dictionary<string, DNA>();

   public IEnumerable<DNA<T>> GetDNAOfType<T>()
   {
      return chromosomes.Values.OfType<DNA<T>>();
   }

   public void AddDNA(string key, DNA dna)
   {
      if (chromosomes.ContainsKey(key))
         chromosomes[key] = dna;
      else
         chromosomes.Add(key, dna);
   }
}
public abstract class DNA
{
}

public class DNA<T> : DNA
{
   public T[] Genes { get; private set; }
}
...