比较两种不同类型的列表的项目c#

时间:2017-03-06 08:40:45

标签: c#

我想将两个不同的列表与一个共同的属性(Name)进行比较。我尝试过.Contains()方法之类的东西,但这不起作用,因为我正在处理两个不同对象的列表。我在以下问题中尝试过这些解决方案:

C# Compare Two Lists of Different Objects

C#, compare two different type of lists

compare different type of list in c#

但是这些解决方案不起作用,因为我的列表需要一个Property或Animal对象而不是"字符串",这就是我被卡住的地方。

我有两个班级:

 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..  

我想要做的是,比较这两个列表以及&#34; Name&#34;匹配我想获得属于此名称的两个列表的内容。我也尝试过使用HashSet或Dictionary,但这不是我想要的。

2 个答案:

答案 0 :(得分:9)

您可以在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将具有空值(尽管您可以提供所需的任何默认值)。

答案 1 :(得分:1)

谢尔盖别列佐夫斯基的解决方案很好,值得所有的赞成并成为公认的答案,但是,我想补充一个替代方案。您可以创建名为class的{​​{1}},如下所示:

Named

并从中继承class Named { public string Name = string.Empty; } es,如下所示:

class

这将使您能够使用 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; } 作为类型,这将允许您使用LINQ或循环轻松完成任务。这种方法的好处是你不会在List<Named> es中复制相同的成员,如果你需要做更多这样的事情,或者你将会有更多类似的成员和/或方法,那么你不会复制你的代码。