Angenommen, ich habe eine Person
Klasse wie unten, wo ich zwei Instanzen einer Person
Sammlung haben, die erste Instanz ist die Master-Sammlung mit allen Aufzeichnungen, während die zweite Instanz ist eine Teilmenge der Master-Sammlung.C# Linq - Matching zwei Sätze von Daten und die Aktualisierung der ersten Satz auf eine Übereinstimmung
Was ich tun muss, ist die IsMatched-Eigenschaft des Master-Sets zu aktualisieren, wo die Instanz auch in der Teilmenge vorhanden ist.
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; }
}
Kann aufzählbare Intersect oder Any Gebrauch sein anzupassen und zu aktualisieren setzen die Stammdaten?
Basierend auf Tims schlage ich einen Komponententest erstellen die Lösung zu testen
[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);
}
}
}
Das bestehende Objekt enthielt die drei Elemente aus der Untergruppe mit einem Master und Subset Instanz innerhalb und den IsMatched Eigenschaften für alle Fälle noch Falsch.
Erforderlich ist, dass die gesamte Master-Auflistung mit den übereinstimmenden Elementen aus der Untergruppe zurückgegeben wird, die die IsMatched-Eigenschaft in der übereinstimmenden Master-Auflistungsinstanz mit true kennzeichnet.
Eine weitere Option
dies eine geeignete Lösung sein würde?
buddy.ForEach(b =>
{
var member = members.FirstOrDefault(w => w.Id == b.Id);
if (member != null)
member.IsMatched = true;
});
Wieviel Einträge haben diese Sammlungen enthalten? – Fabjan
Der Mastersatz enthält vielleicht 9000 Zeilen, während die Teilmenge 50-100 enthalten kann –