Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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#_Linq_Distinct Values - Fatal编程技术网

C# 不同于对象列表的值

C# 不同于对象列表的值,c#,linq,distinct-values,C#,Linq,Distinct Values,我需要你的帮助。我试图从对象列表中获取不同的值。 我的班级是这样的: class Chromosome { public bool[][] body { get; set; } public double fitness { get; set; } } 现在我有了人口列表。现在我需要的是一种方法,如何获得新列表:list newGeneration。这个新列表将只包含原始列表-群体中唯一的染色体。染色体是唯一的,当他的整个身体(在本例中是2D布尔数组)与其他染色体相比是唯一的。

我需要你的帮助。我试图从对象列表中获取不同的值。 我的班级是这样的:

class Chromosome
{
    public bool[][] body { get; set; }
    public double fitness { get; set; }
}
现在我有了
人口列表
。现在我需要的是一种方法,如何获得新列表:
list newGeneration
。这个新列表将只包含原始列表-群体中唯一的染色体。

染色体是唯一的,当他的整个身体(在本例中是2D布尔数组)与其他染色体相比是唯一的。 我知道,有一些东西像MoreLINQ,但我不确定,我是否应该使用第三方代码,我知道我应该覆盖一些方法,但我有点迷路了。所以我真的很感激一些很好的一步一步的描述,即使是白痴也能做到:)
THX

首先,实现相等运算符(这进入染色体类):

公共类染色体体比较器:IEqualityComparer
{
私有布尔等值(布尔[]左,布尔[]右)
{
if(left.Length!=right.Length)
{
返回false;
}
返回left.Zip(right,(x,y)=>x.SequenceEquals(y)).All();
}
公共布尔等于(左染色体,右染色体)
{
返回相等值(left.body,right.body)
}
//实现GetHashCode很难。
//这是一个垃圾实现。
公共整数GetHashCode(染色体c)
{
int numberofools=c.body.SelectMany(x=>x.Count();
int numberOfTrues=c.body.SelectMany(x=>x).Where(b=>b.Count();
返回值(17*numberOfBools)+(23*numberOfTrues);
}
}
召集人:

List<Chromosome> nextGeneration = population
  .Distinct(new ChromosomeBodyComparer())
  .ToList();
List nextGeneration=population
.Distinct(新的染色体体比较器())
.ToList();

你能给我们一些输入/输出的例子吗?我在做遗传算法,染色体体代表关联规则的二进制表示。Body代表了整个规则,稍后我将对其进行解码,然后根据适应度函数评估其质量,并将其保存到适应度。它背后的代码要大得多,我刚刚从中提取出来。因为我不知道任何优雅的方法,我如何才能得到其他列表中不同对象的列表(基于布尔的2D数组的相似性进行比较)…你真的应该一起覆盖
Equals
GetHashCode
。另外,如果您不想将其直接添加到类中,可以将
Distinct
IEqualityComparer
重载一起使用。@Trustme-I'maDoctor您的用户名非常适合这个问题。@Trustme-I'maDoctor:您对
GetHashCode
有什么建议?我想不出任何有意义和容易理解的想法implement@csharpler我要么使用ReSharper建议的默认值(我现在不记得了),要么使用基于素数的有效Java中的默认值,我可能有一个愚蠢的问题:)但我如何在函数中使用void和than return?
var newGeneration = population.Distinct().ToList();
public class ChromosomeBodyComparer : IEqualityComparer<Chromosome>
{
  private bool EqualValues(bool[][] left, bool[][] right)
  {
    if (left.Length != right.Length)
    {
      return false;
    }
    return left.Zip(right, (x, y) => x.SequenceEquals(y)).All();
  }

  public bool Equals(Chromosome left, Chromosome right)
  {
    return EqualValues(left.body, right.body)
  }

     //implementing GetHashCode is hard.
     // here is a rubbish implementation.
  public int GetHashCode(Chromosome c)
  {
    int numberOfBools = c.body.SelectMany(x => x).Count();
    int numberOfTrues = c.body.SelectMany(x => x).Where(b => b).Count();
    return (17 * numberOfBools) + (23 * numberOfTrues);

  }
}
List<Chromosome> nextGeneration = population
  .Distinct(new ChromosomeBodyComparer())
  .ToList();