我想将两个不同的列表与一个共同的属性(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,但这不是我想要的。
答案 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 join(check 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中复制相同的成员,如果你需要做更多这样的事情,或者你将会有更多类似的成员和/或方法,那么你不会复制你的代码。