删除列表c#中的重复引用

Nic*_*asR 5 c# list

我在删除列表中的重复引用时遇到问题.

我有这个清单

List<SaveMongo> toReturn
Run Code Online (Sandbox Code Playgroud)

我的班级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()
    { }
}
Run Code Online (Sandbox Code Playgroud)

每当我想在列表中添加元素时,我都使用以下代码

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);
}
Run Code Online (Sandbox Code Playgroud)

但是,我有时会得到重复的引用.我试过用这个

toReturn = toReturn.Distinct().ToList();
Run Code Online (Sandbox Code Playgroud)

删除它们.没有成功.

我也试过这样做

if (!toReturn.Contains(AddingSaveMongo(doc.GetValue("_id"))))
   toReturn.Add(AddingSaveMongo(doc.GetValue("_id")));
Run Code Online (Sandbox Code Playgroud)

仍然没有成功.但每当我在列表中打印引用时,我都会得到这些结果 在此输入图像描述

在此输入图像描述

我在这里缺少什么,以便我的列表中仍然有重复参考?

Yuv*_*kov 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);
    }
}
Run Code Online (Sandbox Code Playgroud)


Gen*_*mer 6

使用分组:

toReturn = (from e in toReturn
            group e by e._id into g
            select g.First()).ToList();
Run Code Online (Sandbox Code Playgroud)

此外,您可以按两个(或更多)字段进行分组:

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();
Run Code Online (Sandbox Code Playgroud)