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();