2017-03-06 62 views
4

我想比较两个不同的列表与一个共同的属性(名称)。我尝试过.Contains()方法之类的东西,但这不起作用,因为我正在处理两个不同对象的列表。我在这样的问题尝试解决方案:比较两种不同类型的列表c#

C# Compare Two Lists of Different Objects

C#, compare two different type of lists

compare different type of list in c#

但是这些解决方案不工作,因为我的名单指望房产或动物对象,而不是一个“串”,这是我卡住的地方。

我有两个类:

public class Animal 
    { 
     public string Name = string.Empty; 
     public string XChromosome = string.Empty; 
     public string YChromosome = string.Empty; 
    } 

public class Properties 
{ 
    public string Name = string.Empty; 
    public string Prop1 = string.Empty; 
    public string Prop2 = string.Empty; 
} 

两个名单是这样的:

List<Animal> = "name", "xposition", "yposition" 
       "name1", "xposition1", "yposition1" etc.. 

List<Properties> = "name", "prop1","prop2" 
        "name1", "prop3", "prop4" etc.. 

我想这样做的做的是,比较这两个列表,如果在“名称”比赛我想获得属于这个名字的两个列表的内容。我也尝试使用HashSet或字典,但这不是我正在寻找的。

+0

创建一个可以实现的接口,它只包含name属性。然后有一个函数接受该接口的实例,并仅使用Name属性进行比较。 – ADyson

+0

它们是否应该作为普通实体在您的代码库中进行处理?对我而言,基于名字,动物与属性没有任何关系,所以看起来不太可能需要以同样的方式对待它们。我认为@ADYSON陈述可能很简单,只是加入创建共享接口 – Icepickle

+0

在代码中,我需要比较属性和染色体,唯一连接它们的就是名称。 –

回答

8

您可以在Name财产join两个列表,并得到匹配,而匿名对象:

from a in animals 
join p in properties on a.Name equals p.Name 
select new { 
    a.Name, 
    a.XChromosome, 
    a.YChromosome, 
    p.Prop1, 
    p.Prop2 
} 

你可以尝试一下自己在.NET Fiddle


注意:如果你想获得动物的信息,无论是否有匹配的属性,也可以有不止一个匹配给定的动物,那么你需要使用group joincheck this fiddle了解详细信息):

from a in animals 
    join p in properties on a.Name equals p.Name into g 
    from p in g.DefaultIfEmpty() 
    select new { 
    a.Name, 
    a.XChromosome, 
    a.YChromosome, 
    Prop1 = p?.Prop1, 
    Prop2 = p?.Prop2 
    } 

这将返回每对动物财产加入名称。如果找不到匹配的属性,则默认情况下Prop1和Prop2将具有空值(尽管您可以提供任何默认值)。

+2

快速的家伙!简单,清晰,LINQ! – Smartis

+0

如果我实现这个,我的编译器会抱怨:只能使用赋值,调用,增量,减量和新的对象表达式作为语句。编辑:我找到了解决方案,我的错误 –

+0

@ E.O。我添加了可以运行的可运行代码。检查它并查看代码中缺少的内容。顺便说一句,我建议你使用属性,而不是你的类中的字段 –

1

谢尔盖Berezovsky的解决方案是好的,值得所有upvotes和被接受的答案,但是,我想补充一个替代品。您可以创建一个class称为Named,像这样:

class Named { 
    public string Name = string.Empty; 
} 

,并从它继承你class ES,像这样:

public class Animal : Named 
    { 
     public string XChromosome = string.Empty; 
     public string YChromosome = string.Empty; 
    } 

public class Properties : Named 
{ 
    public string Prop1 = string.Empty; 
    public string Prop2 = string.Empty; 
} 

这将使您能够使用List<Named>类型,这将让你使用LINQ或循环轻松完成任务。这种方法的好处是,你不会复制class中的同一个成员,并且如果你需要做更多的事情,或者你将会有更多类似的成员和/或方法,那么你不会复制你的代码。