2016-09-20 2 views
1

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; 
}); 
+0

Wieviel Einträge haben diese Sammlungen enthalten? – Fabjan

+0

Der Mastersatz enthält vielleicht 9000 Zeilen, während die Teilmenge 50-100 enthalten kann –

Antwort

1

Sie sie beitreten können, speichern beide in einem anonymen Typ und dann ein foreach verwenden:

var existing = from m in master join s in subset on m.Id equals s.Id 
       select new { Master = m, Subset = s }; 
foreach (var both in existing) 
{ 
    both.Master.IsMatched = both.Subset.IsMatched; 
} 

Beachten Sie, dass dies setzt voraus, dass es nur eine Teilmenge für jeden Master ist. Wenn du Duplikate hast, kann das Ergebnis willkürlich sein, weil die letzte Teilmenge-Person gewinnt.

+0

Danke Tim, aber die IsMatched-Eigenschaft scheint für alle Entitäten innerhalb des vorhandenen anonymen Typs sowohl vor als auch nach dem ForEach-Wert falsch zu sein. Wie erhalten Sie eine Mastersammlung vom anonymen Typ mit IsMatched auf True? –

+0

Es scheint auch nur die übereinstimmenden Person-Instanzen aus der Subset-Sammlung –

+0

Ich denke, dass in foreach-Schleife müssen Sie den folgenden Code beide verwenden. Master.IsMatched = true –

-1

Die Schnipsel unten kehrt nur die Datensätze in personListA dass in personListB existieren und wo die angepaßten Datensatz in personListB hat IsMatched Satz true (passenden Datensätzen basiert auf der Eigenschaft Id).

personListA.Where(pla => personListB.Any(plb => plb.Id == pla.Id && plb.IsMatched)); 

Working Demo in .NET Fiddle

+0

Gibt keine Übereinstimmungen zurück. –

+0

Link zu einer funktionierenden Demo hinzugefügt. Es gibt nur Übereinstimmungen zurück, wenn beide Listen eine Person mit derselben ID haben und die Instanz in personListB IsMatched auf true gesetzt hat. –

0

Verwendung in Ihrem Gerät zu testen

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 = true; 
} 
Verwandte Themen