【问题标题】:C# Dictionary of classes with generic typeC# 泛型类的字典
【发布时间】:2020-01-26 18:16:50
【问题描述】:

我正在尝试在 C# 中创建遗传算法,但我想将基因分成几类(染色体)

基本上我有一个定义为的 DNA 类

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

所以我可以拥有 double、bool、int 等类型的基因...

那我想定义一条染色体为

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

所以我可以在染色体上添加多种 DNA 类型,例如

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

字典值应该是object 还是我应该为DNA 类创建一个IDNA 接口来保存对象,然后在每次需要时进行转换?或者有更简单/最好的方法来做到这一点?谢谢!

【问题讨论】:

  • 你应该使Chromosome类通用,否则Dictionary&lt;string, DNA&lt;T&gt;&gt; chromosomes;将无法编译
  • 我首先强调了这一点,但随后它会使 Chromosome 类只接受一种基因(例如,仅 int)我希望它接受多种基因
  • 您的字典必须声明为采用这些子类型之间共有的类型,无论是基类还是接口,DNA&lt;T&gt; 继承自/实现。
  • @feehmt:总的来说,您可以考虑在这里使用KeyedCollection 而不是Dictionary。这样,您可以将表型的名称添加到您的 DNA&lt;T&gt; 类中,同时仍然可以通过该键名进行查找。这可能会使代码更简单和直观,因为您的键将与底层值对象相关联,因此只要您引用该对象就可以随时访问。
  • @feehmt:也与您的问题无关,并承认这可能是一个简化的示例,以说明您的问题:大多数表型源自跨多个染色体的基因表达,就像我一样你当然知道。因此,按染色体对DNA&lt;T&gt; 进行分类可能不是建模许多表型的最有效方法(假设DNA&lt;T&gt; 类旨在表示与特定表型特征相关的基因集合)。

标签: c# generics generic-programming generic-list


【解决方案1】:

对于您编写的多种基因,您可以使用接口/抽象类。

对于数据访问而不是强制转换,您可以编写一个简单的方法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; }
}

【讨论】:

  • 完美!我认为它可以满足我的需要谢谢! :)
猜你喜欢
  • 1970-01-01
  • 2016-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-21
  • 2010-10-15
相关资源
最近更新 更多