C# 带比较器的并集

C# 带比较器的并集,c#,linq,linqpad,C#,Linq,Linqpad,我有一张物品清单,我正试图重新记录 有些记录没有Id(0),有些记录有Id,是否可以获取Id为的记录 void Main() { var a = new Skill {Id =0, Name="test"}; var b = new Skill {Id =0, Name="test"}; var c = new Skill {Id= 1, Name="test" }; // masterlist skill var listA = new List<Skill> { a, b };

我有一张物品清单,我正试图重新记录

有些记录没有Id(0),有些记录有Id,是否可以获取Id为的记录

void Main() {

var a = new Skill {Id =0, Name="test"};
var b = new Skill {Id =0, Name="test"};
var c = new Skill {Id= 1, Name="test" }; // masterlist skill
var listA = new List<Skill> { a, b };
var listB = new List<Skill> { c };

var result = listA.Union(listB, new SkillComparer());

result.Dump();
} 

public class SkillComparer : IEqualityComparer<Skill>
{

#region IEqualityComparer<Skill> Members

public bool Equals(Skill skill, Skill skillToCompare)
{
    return skill.Name == skillToCompare.Name;
}

public int GetHashCode(Skill obj)
{
    return obj.Name.GetHashCode();
}

#endregion
}

 public class Skill {
 public int Id {get;set;}
 public string Name {get;set;}
有没有办法返回materlist的id

ID:1 | Name: Test
使用linq:

var result = listA.Concat(listB).OrderByDescending(s => s.Id).Distinct(new SkillComparer());
这将产生一个按名称排列的技能列表,每个技能都包含其名称的最大Id

var a = new Skill {Id =0, Name="test"};
var b = new Skill {Id =2, Name="test"};
var c = new Skill {Id= 1, Name="test" };
var d = new Skill { Id = 3, Name = "foo" };
var e = new Skill { Id = 0, Name = "foo" };

var listA = new List<Skill> { a, b };
var listB = new List<Skill> { c, d, e };

var result = listA.Concat(listB).OrderByDescending(s => s.Id).Distinct(new SkillComparer());

foreach (var skill in result)
{
    Console.WriteLine(string.Format("{0}: {1}", skill.Name, skill.Id));
}

有更有效的方法,但根据我对这个问题的了解:

listA.AddRange(listB).Where(o => o.Name == desiredName).Max(o => o.Id);

您需要更改您的
skillcompare
@miliesmith我尝试返回
skill.Name==skillToCompare.Name&&skill.Id>skillToCompare.Id但是没有luckIt是平等的。您是否希望它比较并指出哪一个更大,并返回最大的id?所有id中最大的id?或者某个特定名称的最大id?是否可以有多个“最伟大的”?我假设预期的结果是一个技能列表,每个技能都有一个唯一的名称,并且每个技能的名称都包含最大的Id。我仍然希望首先排序的区域应允许在列表中保留最高的Id。
foo: 3
test: 2
listA.AddRange(listB).Where(o => o.Name == desiredName).Max(o => o.Id);