2015-05-21 12 views
5

Ich habe Probleme beim Löschen der doppelten Referenzen in meiner Liste.Löschen von doppelten Referenzen in Liste C#

Ich habe diese Liste

List<SaveMongo> toReturn 

mit meiner Klasse SaveMongo, die wie dieser

public class SaveMongo 
{ 
    public ObjectId _id { get; set; } 
    public DateTime date { get; set; } 
    public Guid ClientId { get; set; } 
    public List<TypeOfSave> ListType = new List<TypeOfSave>(); 
    public List<ObjectId> ListObjSave = new List<ObjectId>(); 
    public SaveMongo() 
    { } 
} 

Immer, wenn ich sieht ein Element meiner Liste hinzufügen möchte ich den folgenden Code

public static fctName(BsonDocument doc) 
{ 
    toReturn.Add(AddingSaveMongo(doc.GetValue("_id"))); 
} 

public static SaveMongo AddingSaveMongo(BsonValue ObjValue) 
{ 
    foreach (SaveMongo doc in SpeCollection.FindAll()) 
    { 
     foreach (var id in doc.ListObjSave) 
     { 
      if (id == ObjValue) 
       return (doc); 
     } 
    } 
    return (null); 
} 

Allerdings erhalte ich manchmal doppelte Referenzen. Ich habe versucht, diese

toReturn = toReturn.Distinct().ToList(); 

zu verwenden, um sie zu löschen. Ohne Erfolg.

Ich habe auch versucht, ohne Erfolg dieses

if (!toReturn.Contains(AddingSaveMongo(doc.GetValue("_id")))) 
    toReturn.Add(AddingSaveMongo(doc.GetValue("_id"))); 

noch zu tun. Aber immer, wenn ich die Referenzen in meiner Liste drucken erhalte ich jenes Ergebnis enter image description here

enter image description here

Was ich hier fehle, so dass ich noch Duplikate Referenzen in meiner Liste habe?

+0

Alternativ, wenn Sie‘ Wenn Sie .netfw> 3.5 verwenden, können Sie ein HashSet verwenden. Dann müssen Sie sich keine Gedanken über Duplikate machen. – cup

+2

'HashSet ' muss immer noch wissen, wie diese Objekte zu vergleichen sind. –

Antwort

6

Verwenden Gruppierung:

toReturn = (from e in toReturn 
      group e by e._id into g 
      select g.First()).ToList(); 

Auch Sie können Gruppe von zwei (oder mehr) Felder:

toReturn = (from e in toReturn 
      // group by ID and Date component 
      group e by new { e._id, e.date.Date } into g 
      select g.First()).ToList(); 
8

Derzeit entspricht Distinct Ihren Objekten mit object.Equals, was Referenzgleichheit tut. Eine Möglichkeit, um zu bestimmen, ob Objekte basierend auf anderen Kriterien übereinstimmen sollen, ist die Implementierung von IEquatable<SaveMongo>. Dieses Beispiel vergleicht Objekte anhand ihrer Id:

public class SaveMongo : IEquatable<SaveMongo> 
{ 
    public ObjectId _id { get; set; } 
    public DateTime date { get; set; } 
    public Guid ClientId { get; set; } 
    public List<TypeOfSave> ListType = new List<TypeOfSave>(); 
    public List<ObjectId> ListObjSave = new List<ObjectId>(); 

    public override bool Equals(object obj) 
    { 
     if (ReferenceEquals(null, obj)) return false; 
     if (ReferenceEquals(this, obj)) return true; 
     if (obj.GetType() != this.GetType()) return false; 
     return Equals((SaveMongo) obj); 
    } 

    public override int GetHashCode() 
    { 
     return _id.GetHashCode(); 
    } 

    public bool Equals(SaveMongo other) 
    { 
     return _id.Equals(other._id); 
    } 
}