2017-12-14 2 views
0

Ich brauche Berücksichtigung Elemente in einer einzigen Liste entfernenElemente in einer Liste entfernen dupliziert Subelemente

public class Person 
{ 
    public int id { get; set; } 
    public string name { get; set; } 
    public List<IdentificationDocument> documents { get; set; } 

    public Person() 
    { 
     documents = new List<IdentificationDocument>(); 
    } 
} 

public class IdentificationDocument 
{ 
    public string number { get; set; } 
} 

Code:

 var person1 = new Person() {id = 1, name = "Bob" }; 
     var person2 = new Person() {id = 2, name = "Ted" }; 
     var person3 = new Person() {id = 3, name = "Will_1" }; 
     var person4 = new Person() {id = 4, name = "Will_2" }; 

     person1.documents.Add(new IdentificationDocument() { number = "123" }); 
     person2.documents.Add(new IdentificationDocument() { number = "456" }); 
     person3.documents.Add(new IdentificationDocument() { number = "789" }); 
     person4.documents.Add(new IdentificationDocument() { number = "789" }); //duplicate 

     var personList1 = new List<Person>(); 

     personList1.Add(person1); 
     personList1.Add(person2); 
     personList1.Add(person3); 
     personList1.Add(person4); 

     //more data for performance test 
     for (int i = 0; i < 20000; i++) 
     { 
      var personx = new Person() { id = i, name = Guid.NewGuid().ToString() }; 
      personx.documents.Add(new IdentificationDocument() { number = Guid.NewGuid().ToString() }); 
      personx.documents.Add(new IdentificationDocument() { number = Guid.NewGuid().ToString() }); 
      personList1.Add(personx); 
     } 

     var result = //Here comes the linq query 

     result.ForEach(r => Console.WriteLine(r.id + " " +r.name)); 

Erwartetes Ergebnis:

 
1 Bob 
2 Ted 
3 Will_1 

Beispiel

https://dotnetfiddle.net/LbPLcP

Vielen Dank!

+0

Spielt es eine Rolle, welche entfernt wird? Sie sagten, Sie erwarten, dass Person 4 entfernt wird, aber was sind die Kriterien? Ist es nur die Reihenfolge der Platzierung in der Liste, früher hat Priorität? Was passiert, wenn Sie eine fünfte Person hinzufügen und sie zwei Identitätsdokumente haben, die mit zwei anderen in der Liste übereinstimmen (sagen wir, sie hatten 123 und 456 als ihre Dokumente). Möchten Sie die Person mit 2 Dokumenten behalten und die anderen beiden Personen entfernen? – pstrjds

+3

Mögliches Duplikat von [LINQs Distinct() für eine bestimmte Eigenschaft] (https://stackoverflow.com/questions/489258/linqs-distinct-on-a-particular-property) –

Antwort

0

Nun ja, Sie einen benutzerdefinierten comparer nutzen könnten. Aber das wird viel mehr Code als Ihr spezifisches Beispiel erfordert. Wenn Ihr konkretes Beispiel alles was Sie brauchen ist, wird dies das hervorragend funktionieren:

var personDocumentPairs = personList1 
    .SelectMany(e => e.documents.Select(t => new {person = e, document = t})) 
    .GroupBy(e => e.document.number).Select(e => e.First()); 
var result = personDocumentPairs.Select(e => e.person).Distinct(); 
0

entlang der Linien von Adams Lösung der Trick Personen zu durchlaufen ist und gruppieren sie durch zugehörige Belegnummern.

// persons with already assigned documents 
// Will_2 
var duplicate = from person in personList1 
       from document in person.documents 
       group person by document.number into groupings 
       let counter = groupings.Count() 
       where counter > 1 
       from person in groupings 
        .OrderBy(p => p.id) 
        .Skip(1) 
       select person; 

// persons without already assigned documents 
// Bob 
// Ted 
// Will_1 
var distinct = from person in personList1 
       from document in person.documents 
       group person by document.number into groupings 
       from person in groupings 
        .OrderBy(p => p.id) 
        .Take(1) 
       select person; 

der orderby ist eine aus Regel für die bereits Personen Dokumente zugeordnet, aber die Leistung kann variieren

Verwandte Themen