假设我有一个Person
类,如下所示,其中有两个Person
集合实例,第一个实例是包含所有记录的主集合,而第二个实例实例是主集合的一个子集。C#Linq - 匹配两组数据并更新匹配的第一组
我需要做的是更新主集的IsMatched属性,其中实例也存在于子集中。
public class Person
{
public int Id { get; set; }
public string Title { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public bool IsMatched { get; set; }
}
基于Tim的建议我创建一个单元测试来测试解决方案
[TestFixture()]
public class Test
{
[TestFixture]
public class MatchedSetTest
{
private class Person
{
public int Id { get; set; }
public string Title { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public bool IsMatched { get; set; }
}
[Test]
public void TestMatchingSets()
{
var members = new List<Person>()
{
new Person() { FirstName = "Tom", LastName = "Smith", Id = 1, Title = "Mr", IsMatched = false} ,
new Person() { FirstName = "Paul", LastName = "Jones", Id = 2, Title = "Mr", IsMatched = false} ,
new Person() { FirstName = "Gary", LastName = "Thompson", Id = 3, Title = "Mr", IsMatched = false} ,
new Person() { FirstName = "Simon", LastName = "Green", Id = 4, Title = "Mr", IsMatched = false} ,
new Person() { FirstName = "Phil", LastName = "Stuart", Id = 5, Title = "Mr", IsMatched = false} ,
new Person() { FirstName = "Sean", LastName = "Appleton", Id = 6, Title = "Mr", IsMatched = false}
};
var buddy = new List<Person>()
{
new Person() { FirstName = "Tom", LastName = "Smith", Id = 1, Title = "Mr", IsMatched = false} ,
new Person() { FirstName = "Gary", LastName = "Thompson", Id = 3, Title = "Mr", IsMatched = false} ,
new Person() { FirstName = "Simon", LastName = "Green", Id = 4, Title = "Mr", IsMatched = false}
};
var existing = from m in members
join s in buddy on m.Id equals s.Id
select new { Master = m, Subset = s };
foreach (var both in existing)
{
both.Master.IsMatched = both.Subset.IsMatched;
}
var p = existing.Where(w => w.Master.Id == 1).FirstOrDefault().Master;
Assert.IsTrue(p.IsMatched);
}
}
}
现有的对象包含与内的主机和子集实例和所有实例IsMatched性能从子集的三个项目仍然假。
我需要的是整个主集合返回时,匹配的主集合实例上的子集中的匹配项将IsMatched属性标记为true。
另一个选项
这会是一个合适的解决方案?
buddy.ForEach(b =>
{
var member = members.FirstOrDefault(w => w.Id == b.Id);
if (member != null)
member.IsMatched = true;
});
多少项做这些集合包含哪些内容? – Fabjan
主集包含大约9000行,而子集可能包含50-100 –