2015-05-21 23 views
5

Tôi gặp sự cố khi xóa các tham chiếu trùng lặp trong danh sách của mình.Xóa các tham chiếu trùng lặp trong danh sách C#

Tôi có danh sách

List<SaveMongo> toReturn 

này với lớp học của tôi SaveMongo trông như thế này

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

Bất cứ khi nào tôi muốn thêm một yếu tố vào danh sách của tôi, tôi sử dụng đoạn mã sau

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

Tuy nhiên, đôi khi tôi nhận được các tham chiếu trùng lặp. Tôi đã thử sử dụng

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

để xóa chúng. Không thành công.

Tôi cũng đã cố gắng để làm điều này

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

Tuy không thành công. Nhưng bất cứ khi nào tôi in các tài liệu tham khảo trong danh sách của tôi, tôi có được những kết quả enter image description here

enter image description here

Những gì tôi đang mất tích ở đây vì vậy mà tôi vẫn có bản sao tài liệu tham khảo trong Danh sách của tôi?

+0

Ngoài ra, nếu bạn' tái sử dụng .netfw> 3.5, bạn có thể sử dụng một HashSet. Sau đó, bạn sẽ không phải lo lắng về các bản sao. – cup

+2

'HashSet ' sẽ vẫn cần biết cách so sánh các đối tượng đó. –

Trả lời

6

Sử dụng nhóm:

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

Ngoài ra, bạn có thể nhóm bởi hai (hoặc nhiều hơn) các lĩnh vực:

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

Hiện tại, Distinct khớp với các đối tượng của bạn bằng cách sử dụng object.Equals, đang thực hiện bình đẳng tham chiếu. Một cách để cho nó khớp với các đối tượng dựa trên các tiêu chí khác là bằng cách thực hiện IEquatable<SaveMongo>. Ví dụ này so sánh các đối tượng dựa trên Id của họ:

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); 
    } 
} 
Các vấn đề liên quan