2015-05-21 11 views
5

Ho problemi a eliminare i riferimenti duplicati nella mia lista.Eliminazione di riferimenti duplicati nell'elenco C#

ho questa lista

List<SaveMongo> toReturn 

con la mia classe SaveMongo che assomiglia a questo

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() 
    { } 
} 

Ogni volta che voglio aggiungere un elemento alla selezione Io uso il seguente codice

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

Tuttavia, a volte ottengo riferimenti duplicati. Ho provato a utilizzare questo

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

per eliminarli. Senza successo.

Ho anche provato a fare questo

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

Ancora senza successo. Ma ogni volta che posso stampare i riferimenti nella mia lista ho coloro risultato enter image description here

enter image description here

Quello che mi manca qui in modo che ho ancora duplicati riferimenti nella mia lista?

+0

In alternativa, se si' usando .netfw> 3.5, potresti usare un HashSet. Quindi non dovrai preoccuparti dei duplicati. – cup

+2

'HashSet ' dovrà ancora sapere come confrontare tali oggetti. –

risposta

6

utilizzare il raggruppamento:

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

Inoltre, è possibile raggruppare da due (o più) campi:

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

Attualmente, Distinct è corrispondente ai vostri oggetti utilizzando object.Equals, che sta facendo l'uguaglianza di riferimento. Un modo per dirlo per abbinare gli oggetti in base ad altri criteri è implementando IEquatable<SaveMongo>. Questo esempio confronta gli oggetti in base alla loro 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); 
    } 
}