2015-05-21 2 views
5

У меня проблема с удалением дубликатов ссылок в моем списке.Удаление дубликатов ссылок в списке C#

У меня есть этот список

List<SaveMongo> toReturn 

с моим классом SaveMongo, который выглядит, как этот

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

Всякий раз, когда я хочу, чтобы добавить элемент в список, я использую следующий код

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

Однако иногда я получаю дубликаты ссылок. Я попытался использовать это

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

, чтобы удалить их. Безуспешно.

Я также попытался это сделать

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

Тем не менее, без успеха. Но всякий раз, когда я печатаю ссылки в моем списке я получаю эти результаты enter image description here

enter image description here

Что я здесь отсутствует, так что я до сих пор дубликаты ссылок в моем списке?

+0

В качестве альтернативы, если вы» re using .netfw> 3.5, вы можете использовать HashSet. Тогда вам не придется беспокоиться о дубликатах. – cup

+2

'HashSet ' все равно нужно будет знать, как сравнивать эти объекты. –

ответ

6

использования группировки:

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

Кроме того, вы можете сгруппировать два (или более) полей:

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

В настоящее время Distinct соответствует вашим объектам, используя object.Equals, что делает ссылочное равенство. Один из способов сказать, что он соответствует объектам, основанным на других критериях, - это реализовать IEquatable<SaveMongo>. Этот пример сравнивает объекты на основе их 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); 
    } 
} 
Смежные вопросы